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)