模型查询
概述
- 查询集表示从数据库获取的对象集合
- 查询集可以有多个过滤器
- 过滤器就是一个函数,基于所给的参数限制查询结果
- 从sql角度来说, 查询集和select语句等价,过滤器如where条件
查询集
简介
- 在管理器中调用过滤器方法返回查询集合;
- 查询集合经过过滤器后返回新的查询集合, 所以可以写成链式调用
- 惰性执行: 创建查询集合不会带来任何数据的访问, 直到调用数据时, 才会访问数据;
- 直接访问数据的情况:
- 迭代
- 序列化
- 与if 合用
- 返回查询集合的方法称为过滤器
方法
返回查询集合
- all()
- 返回查询集合中的所有数据
- filter()
- 保留符合条件的数据
- filter(键=值)
- filter(键=值, 键=值)
- filter(键=值).filter(键=值)
- exclude()
过滤掉符合条件的数据
- order_by()
排序
- value()
一条数据就是一个对象(字典), 返回一个列表;
返回单个数据
- get()
返回一个满足条件的对象
注意:
- 如果没有找到符合条件的对象, 会引发<“模型类.DoesNotExist”>异常
- 如果找到多个对象,会引发<“模型类.MultipleObjectsReturned”>异常
- count()
返回当前查询集合中的对象个数
- first()
返回查询集合中的第一个对象
- last()
返回查询集合中的最后一个对象
- exist()
判断查询集合中是否存在要查询的数据;
限制查询集
查询集合返回列表, 可以使用下标的方法进行限制, 等同于sql语句中的limit.
例:
studentslist = Student.objects.all()[0:5]
注意: 下标不能是负数
查询集的缓存
概述: 每个查询集都包含一个缓存, 来最小化的对数据库访问
在新建的查询集合中, 缓存首次为空, 第一次对查询集求值, 会发生数据缓存, Django会将查询出来的数据做缓存, 病返回查询结构, 以后的查询直接使用查询集合的缓存;
字段查询
-
概述
实现了sql中的where语句, 作为方法filter(), exclude(), get()的参数
-
语法
属性名称_比较运算符=值
-
外键
属性名_id
-
转义
类似sql中的like语句: like语句中使用%是为了匹配占位, 匹配数据中的%{where like %}
filter(name__contains=‘%)
-
比较运算符
-
exact:
- 判断, 区分大小写
- filter(isDelete=False)
-
contain
-
是否包含, 区分大小写
studentList = Student.objects.filter(name__contains="sun")
-
-
startwith/endwith
以某个字段开头或结尾, 区分大小写
-
以上4个方法, 在前面加上i, 表示不区分大小写: iexact, icontain, istartwith, iendwith
-
in
-
是否包含在范围内
StudentList = Student.objects.filter(pk__in=[2,4,6,8,10])
-
-
gt/gte/lt/lte
大于/大于等于/小于/小于等于
StudentList = Student.objects.filter(age__gt=30)
-
year/month/day/week_day/hour/minute/second
StudentList = student.objects.filter(lastTime__year=2017)
-
跨关联查询
处理join查询
语法:
模型类名__属性名__比较运算符
-
查询快捷
pk: 代表的主键
聚合函数
使用aggregate()返回聚合函数的值
Avg/Count/Max/Min/Sum
平均/计数/最大/最小/求和
maxAge = Student.objects.aggregate(Max("age"))
F对象
过滤器方法中的关键字参数
可以使用模型的A属性和B属性进行比较
from django.db.models import F
Grade.objects.filter(girlnum__gt=F(‘boynum’))
支持F对象的算术运算
Grade.objects.filter(girlnum__gt=F(‘boynum’+20))
Q对象
概述: 过滤器方法中的关键字参数, 条件为And模式
功能: 进行or查询
例:
Student.objects.filter(Q(pk__lte=3) | Q(age__gt=50))
如果只有一个Q, 则表示匹配Q内的数据, 同filter.
如果在Q前加~, 则表示取反
Student.objects.filter(~Q(age__gt=50))