详解模型类
属性命名限制:
- 不能是python的保留关键字。
- 不允许使用连续的下划线。
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)
字段介绍
- AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
- BooleanField:布尔字段,值为True或False。
- NullBooleanField:支持Null、True、False三种值。
- CharField(max_length=字符长度):字符串。参数max_length表示最大字符个数。
- TextField:大文本字段,一般超过4000个字符时使用。
- IntegerField:整数。
- DecimalField(max_digits=None, decimal_places=None):十进制浮点数。参数max_digits表示总位数。参数decimal_places表示小数位数。
- FloatField:浮点数。
- DateField[auto_now=False, auto_now_add=False]):日期。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。 - TimeField:时间,参数同DateField。DateTimeField:日期时间,参数同DateField。
- FileField:上传文件字段。
- ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
选项
通过选项实现对字段的约束,选项如下:
- null:如果为True,表示允许为空,默认值是False。
- blank:如果为True,则该字段允许为空白,默认值是False。
- 对比:null是数据库范畴的概念,blank是表单验证范畴的。
- db_column:字段的名称,如果未指定,则使用属性的名称。
- db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
- default:默认值。
- primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
- unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
条件查询字段
实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例。
通过"属性名_id"表示外键对应对象的id值。
说明:属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。
语法如下:
属性名称__比较运算符=值
配置mysql日志
右键Navicat数据库选择运行命令行界面,输入:
show variables like "general_log%";
SET GLOBAL general_log = 'ON';
show variables like "general_log%";
然后查看日志(可用NotePad++打开)
在pycharm,Terminal中输入:
python manage.py shell
1. 查询
进入命令界面输入
from booktest.models import BookInfo,HeroInfo
BookInfo.objects.filter(id__exact=1)
# 可简写为:BookInfo.objects.filter(id=1)
然后在notepad++中查看日志最新生成的sql语句
Query SELECT `booktest_bookinfo`.`id`, `booktest_bookinfo`.`btitle`, `booktest_bookinfo`.`bpub_date`, `booktest_bookinfo`.`bread`, `booktest_bookinfo`.`bcomment`, `booktest_bookinfo`.`isDelete` FROM `booktest_bookinfo` WHERE `booktest_bookinfo`.`id` = 1 LIMIT 21
2.模糊查询
- contains:是否包含。
# 说明:如果要包含%无需转义,直接写即可。例:查询书名包含'英雄'的图书。
BookInfo.objects.filter(btitle__contains='英雄')
- startswith、endswith:以指定值开头或结尾。
# 例:查询书名以'部'结尾的图书
BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
3.空查询
isnull:是否为null。
# 例:查询书名不为空的图书。
BookInfo.objects.filter(btitle__isnull=False)
4.范围查询
in:是否包含在范围内。
# 例:查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 3, 5])
5.比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于。
# 例:查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
例:查询编号大于3的图书
BookInfo.objects.exclude(id=3)
6.日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
# 例:查询1995年发表的图书。
BookInfo.objects.filter(bpub_date__year=1995)
# 例:查询1985年1月1日后发表的图书。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1985, 1, 1))
F 对象
两个属性比较需要使用F对象,F对象被定义在django.db.models中。(需先引用后调用)
下面我们来应用一下F对象
# 语法说明
F(属性名)
# 例:查询阅读量大于等于评论量的图书。
from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
#可以在F对象上使用算数运算。
#例:查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
# 例:查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(bread__gt=20,id__lt=3)
# 或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符
- Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
- Q对象前可以使用~操作符,表示非not。
#语法说明:
Q(属性名__运算符=值)
#例:查询阅读量大于20的图书,改写为Q对象如下。
from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20))
# 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
# 例:查询编号不等于3的图书。
BookInfo.objects.filter(~Q(pk=3))
聚合函数
使用aggregate()过滤器调用聚合函数。
聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。
# 例:查询图书的总阅读量
from django.db.models import Sum
BookInfo.objects.aggregate(Sum('bread'))
注意aggregate的返回值是一个字典类型
# 格式如下:
{'聚合类小写__属性名':值}
# 如:{'sum__bread':3}使用count时一般不使用aggregate()过滤器。
# 例:查询图书总数
BookInfo.objects.count()