生成迁移文件:1.进入虚拟环境 或 创建虚拟环境 mkvirtualenv cc / workon cc
2.安装django1.11的包 pip install django==1.11
3.创建项目 django-admin startproject 项目名称 例如:django-admin startproject test1
4.进入项目 创建应用:cd test1 python manage.py startapp booktest
5.安装应用 在setting文件中配置'booktest', 更改链接数据库MySQL的~~~
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test2', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
配置中文LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间
在mysql里面创建数据库 ,字符集是utf8 create database test2 charset=utf8;
6.运行文件 pyrhn manage.py runserver 默认IP是127.0.0.1,默认端口为8000 ,可以不写
7.在models.py中定义模型 from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateField()
8. 在init文件中加上 import pymysql pymysql.install__as__MySQLdb()
9.下载pymysql pip install pymysql
10.生成迁移文件 python manage.py makemigrations
11.执行迁移文件 python manage.py migrate
进入脚本 python manage.py shell
导入booktest/models中的类:from booktest.models import BookInfo,HeroInfo
查询所有图书信息:BookInfo.objects.all()
新建图书对象:b=BookInfo()
b.btitle="射雕英雄传 "
from datetime import date
b.bpub_date=date(1991,1,31)
b.save()
再次查询所有图书信息:BookInfo.objects.all()
查找图书信息并查看值:b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
创建管理员:python manage.py createsuperuser
启动服务器:python manage.py runserver
打开浏览器 ctrl + c,在地址栏中输入如下地址后回车 http://127.0.0.1:8000/admin/
视图:配置URLconf
查找视图的过程 请求者在浏览器地址栏中输入url,请求到网站后,获取url信息,然后与编写好的URLconf逐条匹配,如果匹配成功则调用对应的视图函数,如果所有的URLconf都没有匹配成功,则返回404错误。
一条URLconf包括url规则、视图两部分:1.url规则使用正则表达式定义。
2.视图就是在views.py中定义的视图函数。
需要两步完成URLconf配置:1.在应用中定义URLconf
2.包含到项目的URLconf中
在booktest/应用下创建urls.py文件,定义代码如下:from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^$', views.index),
]
含到项目中:打开test1/urls.py文件,为urlpatterns列表增加项如下:url(r'^', include('booktest.urls')),test1/urls.py文件完整代码如下: from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('booktest.urls')),
创建模板: 设置查找模板的路径:打开test1/settings.py文件,设置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
定义模板:打开templtes/booktest/index.html文件,定义代码如下:
<html>
<head>
<title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}
{%endfor%}
</body>
</html>
打开booktst/views.py文件,调用上面定义的模板文件
from django.http import HttpResponse
from django.template import loader
def index(request):
1.获取模板
template=loader.get_template('booktest/index.html')
2.定义上下文
context={'title':'图书列表','list':range(10)}
3.渲染模板
return HttpResponse(template.render(context))
视图调用模板简写:from django.shortcuts import render
def index(request):
context={'title':'图书列表','list':range(10)}
return render(request,'booktest/index.html',context)]
属性命名限制:1.不能是python的保留关键字。
2.不允许使用连续的下划线,这是由django的查询方式决定的,在后面会详细讲解查询。
3.定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:属性=models.字段类型(选项)
字段类型:使用时需要引入django.db.models包
1.AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。(必须填入参数primary_key=True)
2.BooleanField:布尔字段,值为True或False。
3.NullBooleanField:支持Null、True、False三种值。
4.CharField(max_length=字符长度):字符串。参数max_length表示最大字符个数。
5.TextField:大文本字段,一般超过4000个字符时使用。
6.IntegerField:整数。
7.DecimalField(max_digits=None, decimal_places=None):十进制浮点数。 1.参数max_digits表示总位数。2. 参数decimal_places表示小数位数。
8.FloatField:浮点数。
9.DateField[auto_now=False, auto_now_add=False]):日期。
10.TimeField:时间,参数同DateField。
11.DateTimeField:日期时间,参数同DateField。
12.FileField:上传文件字段。
选项: 1.null:如果为True,表示允许为空,默认值是False。
2.blank:如果为True,则该字段允许为空白,默认值是False。
3.对比:null是数据库范畴的概念,blank是表单验证范畴的。
4.db_column:字段的名称,如果未指定,则使用属性的名称。
5.db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
6.default:默认值。
7.primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
8.unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
字段查询:
实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例。
属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。
属性名称__比较运算符=值
查询mysql数据库日志:
查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
把68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。sudo service mysql restart
条件查询:
- 查询等: exact:表示判等 ==。
例:查询编号为1的图书。
list=BookInfo.objects.filter(id__exact=1) 或 list=BookInfo.objects.filter(id=1) - 模糊查询 : contains:是否包含。
例:查询书名包含'传'的图书。
list = BookInfo.objects.filter(btitle__contains='传')
startswith、endswith:以指定值开头或结尾。
例:查询书名以'部'结尾的图书
list = BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith. - 空查询 : isnull:是否为null。
例:查询书名不为空的图书。
list = BookInfo.objects.filter(btitle__isnull=False) - 范围查询 : in:是否包含在范围内。
例:查询编号为1或3或5的图书
list = BookInfo.objects.filter(id__in=[1, 3, 5]) - 比较查询 : gt、gte、lt、lte:大于、大于等于、小于、小于等于。
例:查询编号大于3的图书
list = BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
list = BookInfo.objects.exclude(id=3) - 日期查询 : year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
list = BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
语法如下:F(属性名)
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
list = BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书。
list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
例:查询阅读量大于20,并且编号小于3的图书。
list=BookInfo.objects.filter(bread__gt=20,id__lt=3) 或 list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
语法如下:
Q(属性名运算符=值)
例:查询阅读量大于20的图书,改写为Q对象如下。
from django.db.models import Q
list = BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q对象前可以使用~操作符,表示非not。
例:查询编号不等于3的图书。
list = BookInfo.objects.filter(~Q(pk=3))
聚合函数:
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。
例:查询图书的总阅读量 : from django.db.models import Sum list = BookInfo.objects.aggregate(Sum('bread'))
注意aggregate的返回值是一个字典类型,格式如下
{'聚合类小写属性名':值} 如:{'sum__bread':3}
使用count时一般不使用aggregate()过滤器。
例:查询图书总数。
list = BookInfo.objects.count()
注意count函数的返回值是一个数字。
django 模型[查询集]
什么是查询集(结果集):查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以 含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
1 .返回查询集的过滤器如下:
1.1 all():返回模型类对应表的所有数据,返回值是QuerySet类型
1.2 filter():返回满足条件的数据,返回值是QuerySet类型,参数可以写查询条件
1.3 exclude(): 返回满足条件之外的数据(即:不满足条件的数据),返回值是QuerySet类型,参数可以写查询条件
提示:相当于sql语句中where部分的not关键字
1.4 order_by(): 对结果进行排序,返回值是QuerySet类型,参数可以写排序中的字段
- 返回单个值的过滤器如下:
2.1 get(): 返回单个满足条件的对象(有且只能有一条数据),参数可以是查询条件
如果未找到会引发"模型类.DoesNotExist"异常。
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
2.2 count():返回当前查询结果的总条数,返回值是一个数字.
2.3 aggregate():进行聚合操作,返回一个字典。
from django.db.models import Sum,Count,Avg,Max,Min - 判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
二、查询集两大特性
1、惰性查询
惰性查询:只有在实际使用查询集中的数据的时候,才会发生对数据库的真正查询, 调用数据的情况包括迭代,序列化,与if合用
示例:查询所有,编辑booktest/views.py的index视图,运行查看。
list=BookInfo.objects.all()
2、查询集的缓存
当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果集
演示: 运行项目shell : python manage.py shell
三、限制查询集
可以对一个查询集进行 取下标或切片 操作,等同于sql中的limit和offset子句。
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
示例:获取第1、2项,运行查看。 list=BookInfo.objects.all()[0:2]
django 模型[关联]:
模型类关系
关系字段类型
关系型数据库的关系包括三种类型:
ForeignKey:一对多,将字段定义在多的一端中。
ManyToManyField:多对多,将字段定义在任意一端中。
OneToOneField:一对一,将字段定义在任意一端中。
可以维护递归的关联关系,使用'self'指定,详见"自关联"。
一对多关系: 参见booktest应用中的BookInfo类和HeroInfo类。
多对多关系:新闻类和新闻类型类,一个新闻类型下可以用很多条新闻,一条新闻也可能归属于多种新闻类型。
关联查询:
由一到多的访问语法: 一对应的模型类对象.多对应的模型类名小写set
例:b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
由多到一的访问语法: 多对应的模型类对象.多对应的模型类中的关系类属性名
例:h = HeroInfo.objects.get(id=1)
h.hbook
访问一对应的模型类关联对象的id语法: 多对应的模型类对象.关联类属性id
例:h = HeroInfo.objects.get(id=1)
h.book_id
python manage.py shell
由多模型类条件查询一模型类数据: 关联模型类名小写属性名条件运算符=值
如果没有"运算符"部分,表示等于,结果和sql中的inner join相同。
例:查询图书,要求图书中英雄的描述包含'八'。 list = BookInfo.objects.filter(heroinfo__hcontent__contains='八')
由一模型类条件查询多模型类数据: 语法如下:一模型类关联属性名一模型类属性名条件运算符=值
例:查询书名为“天龙八部”的所有英雄。 list = HeroInfo.objects.filter(hbook__btitle='天龙八部')
自关联:自关联是一种特殊的一对多的关系
打开booktest/views.py文件,定义视图area。
from booktest.models import AreaInfo
...
查询广州市的信息
def area(request):
area = AreaInfo.objects.get(pk=440100)
return render(request, 'booktest/area.html', {'area': area})
打开booktest/urls.py文件,新建一条url。
urlpatterns = [
...
url(r'^area/$', views.area),
]
在templates/booktest目录下,新建area.html文件。
<html>
<head>
<title>地区</title>
</head>
<body>
当前地区:{{area.atitle}}
上级地区:{{area.aParent.atitle}}
下级地区:
<ul>
{%for a in area.areainfo_set.all%}
<li>{{a.atitle}}</li>
{%endfor%}
</ul>
</body>
</html>
运行服务器。
python manage.py runserver
14_django 模型[模型类扩展]
模型实例方法
1.str():在将对象转换成字符串时会被调用。
2.save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。
3.delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。
模型类的属性
属性objects:管理器,是models.Manager类型的对象,用于与数据库进行交互。
当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。
为模型类BookInfo定义管理器books语法如下:
class BookInfo(models.Model):
books = models.Manager()
管理器Manager
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。
自定义管理器类主要用于两种情况:
1.修改原始查询集,重写all()方法
2.向管理器类中添加额外的方法,如向数据库中插入数据。
元选项
在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字。
数据表的默认名称为:<app_name>_<model_name>例: booktest_bookinfo
视图
视图的功能:视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者。
使用视图的过程:视图就是一个python函数,被定义在"应用/views.py"文件中。 使用视图时需要进行两方面操作,两个操作不分先后。
视图就是python中的函数,视图一般被定义在"应用/views.py"文件中,此例中为"booktest/views.py"文件。视图必须返回一个HttpResponse对象或子对象作为响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误等。
视图的第一个参数必须为HttpRequest实例,还可能包含下参数如:
1.通过正则表达式组获得的关键字参数。
2.通过正则表达式组获取的位置参数。
17_django视图[HttpRequest]
HttpRequest对象
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以。视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API。
属性
下面除非特别说明,属性都是只读的。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
在浏览器中给出地址发出请求采用get方式,如超链接。
在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。
POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。
FILES:一个类似于字典的对象,包含所有的上传文件。
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。
网友评论