/*自定义导航栏*/

Django学习笔记

cd E:\wamp\www\Python\python-webapp\pro_test

http://code.ziqiangxuetang.com/django/django-models.html

bnc

bnc123456

Django 环境搭建

Django 1.8.x 支持 Python 2.7, 3.2, 3.3, 3.4 和 3.5. (长期支持版本 LTS)

Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6,17年4月4号 已经发布(长期支持版本 LTS)

安装 Django

pip install Django==1.8.16 或者 pip install Django==1.11

  

检查是否安装成功

>>> import django
>>> django.VERSION
>>> django.get_version()

  

新建一个 django project

django-admin startproject mysite

  

settings.py 项目的设置文件

urls.py 总的urls配置文件

wsgi.py 部署服务器文件

__init__.py python包的目录结构必须的,与调用有关。

新建 app

python manage.py startapp app_name
或 
django-admin.py startapp app_name

  

创建数据库表 或 更改数据库表或字段

Django 1.7.1及以上 用以下命令

# 1. 创建更改的文件

# 2. 将生成的py文件应用到数据库

python manage.py makemigrations
python manage.py migrate

使用开发服务器

python manage.py runserver

# 当提示端口被占用的时候,可以用其它端口:

python manage.py runserver 8001
python manage.py runserver 9999

(可以kill掉占用端口进程,想知道的同学可查下 lsof 命令用法)

# 监听机器所有可用 ip (电脑可能有多个内网ip或多个外网ip)

python manage.py runserver 0.0.0.0:8000

# 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器

# 访问对应的 ip加端口,比如 http://172.16.20.2:8000

清空数据库

python manage.py flush

创建超级管理员

python manage.py createsuperuser

# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填

# 修改 用户密码可以用:

python manage.py changepassword username

导出数据 导入数据

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

  

Django 项目环境终端

python manage.py shell

 

数据库命令行

python manage.py dbshell

 

更多命令:终端上输入 python manage.py 可以看到详细的列表。

*********************************************************

新建一个项目案例

*********************************************************
1 新建项目:django-admin startproject mysite

2 新建应用:python manage.py startapp learn

3 新定义的app加到settings.py中的INSTALL_APPS中

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'learn',
)

 

4 定义视图函数

4.1 views.py打开

#coding:utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse(u"欢迎光临 自强学堂!")

4.2 定义视图函数相关的URL,打开 mysite/mysite/urls.py 这个文件

from learn import views as learn_views # new
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', learn_views.index), # new
]

4.3 在终端上运行 python manage.py runserver 查看访问URL

创建模板(用于存放html/css/js.eg)

在app名称下面创建templates即可

Django 模型(数据库)

1 修改models.py:
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
2 创建数据表,默认的数据库 SQLite3
在manage.py输入:
python manage.py makemigrations
python manage.py migrate

3 提供的 QuerySet API
python manage.py shell
from people.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
# 方法 1
Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com")
# 方法 2
twz = Author(name="WeizhongTu", email="tuweizhong@163.com")
twz.save()
# 方法 3
twz = Author()
twz.name="WeizhongTu"
twz.email="tuweizhong@163.com"
twz.save()
# 方法 4,首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com")
# 返回值(object, True/False)


*********************************************************
sqlite3数据库常用方法:
**********************************************************

1 创建项目
django-admin startproject [projectname]
2 创建App
django-admin startapp [appname]
3 创建模型
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name

class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()

def __str__(self):
return self.headline

4 创建表
python manage.py makemigrations
python manage.py migrate

5 进入shell
python manage.py shell

6 启动服务器
python manage.py runserver

7 表的相关操作
> from people.models import Person

获取对象:
Person.objects.all()
Person.objects.all()[:10] #不支持负索引,可节约内存
Person.objects.get(name="WZT")

满足条件查询
Person.objects.filter(name="abc")
Person.objects.filter(name__iexact="abc") # 不区分大小写
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

迭代查询:
es = Entry.objects.all()
for e in es:
print(e.headline)

查询排序:
Author.objects.all().order_by('name')
Author.objects.all().order_by('-name')

链式查询:
Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")
# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)

去重查询:
qs = qs.distinct()

增加操作:
① Person.objects.create(name="WeizhongTu", age=24)
② p = Person(name="WZ", age=23)
p.save()
③ p = Person()
p.name="TWZ"
p.age = 23
p.save()
④ Person.objects.get_or_create(name="WZT", age=23) # 速度慢,防重


删除操作:
Person.objects.filter(name__contains="abc").delete()
Person.objects.all().delete()

更新操作:
① Person.objects.filter(name__contains="abc").update(name='xxx')

② twz = Author.objects.get(name="WeizhongTu")
twz.name="WeizhongTu"
twz.email="tuweizhong@163.com"
twz.save() # 最后不要忘了保存!!!

查看查询:
print(Blog.objects.all().query)
SELECT "blog_blog"."id", "blog_blog"."title", "blog_blog"."content" FROM "blog_blog"
获取元组:
authors = Author.objects.values_list('name', 'qq')
list(authors)
Author.objects.values_list('name', flat=True) # 只需要 1 个字段

获取字典:
list(Author.objects.values('name', 'qq'))
Article.objects.filter(author__name='twz915').values('title')

别名
tags = Tag.objects.all().extra(select={'tag_name': 'name'})

计数
from django.db.models import Count
Article.objects.all().values('author_id').annotate(count=Count('author')).values('author_id', 'count')
计算一下每个作者的文章数
SELECT author_id, COUNT(author_id) AS count FROM blog_article GROUP BY author_id
获取作者的名称 及 作者的文章数
Article.objects.all().values('author__name').annotate(count=Count('author')).values('author__name', 'count')

求和
from django.db.models import Avg
求一个作者的所有文章的得分(score)平均值
Article.objects.values('author_id').annotate(avg_score=Avg('score')).values('author_id', 'avg_score')

SELECT "blog_article"."author_id", AVG("blog_article"."score") AS "avg_score" FROM "blog_article" GROUP BY "blog_article"."author_id"
求一个作者所有文章的总分
from django.db.models import Sum
Article.objects.values('author__name').annotate(sum_score=Sum('score')).values('author__name', 'sum_score')

SELECT "blog_author"."name", SUM("blog_article"."score") AS "sum_score" FROM "blog_article" 

INNER JOIN "blog_author" ON ("blog_article"."author_id" = "blog_author"."id") GROUP BY "blog_author"."name" defer 排除不需要的字段 Article.objects.all().defer('content') only 仅选择需要的字段 Author.objects.all().only('name')

  

******************************************************
数据库的导入导出
******************************************************

数据的导入
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
title,content = line.split('****')
blog = Blog(title=title,content=content)
BlogList.append(blog)
f.close()
Blog.objects.bulk_create(BlogList)

数据的导出:
python manage.py dumpdata [appname] > appname_data.json
python manage.py dumpdata blog > blog_dump.json
数据导入
python manage.py loaddata blog_dump.json
导出用户数据
python manage.py dumpdata auth > auth.json # 导出用户数据

数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname1',
'USER': 'your_db_user_name',
'PASSWORD': 'yourpassword',
"HOST": "localhost",
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname2',
'USER': 'your_db_user_name',
'PASSWORD': 'yourpassword',
"HOST": "localhost",
},
}

  


Python/Django 生成二维码

1 pip install qrcode
pip install Image
2 import qrcode
img = qrcode.make('http://www.cnblogs.com/baiboy/')
with open('test.png', 'wb') as f:
img.save(f)

  

posted @ 2017-07-24 16:20  伏草惟存  阅读(438)  评论(0编辑  收藏  举报