object======是模型属性—用于模型对象和数据库交互
一、查询集QuerySet
什么是查询集?
查询集:从数据库查询得到的模型对象集合QuerySet,是一个列表
什么是过滤器?
过滤器:基于查询集得到的结果上进一步进行条件筛选过滤结果
二、过滤器
1. 返回list/多个结果的过滤器
- values = model名称.objects.all()
:返回所有数据;
等价:获取所有数据,对应SQL:select * from User
1. 返回查询集QuerySet对象。
from projects.models import Projects
Projects.objects.all()
Out[3]: <QuerySet [<Projects: 项目1>, <Projects: 项目2>, <Projects: 项目哈哈>, <Projects: 项目哈哈1>]>
2. 因为是列表,所以其结果可以使 用values[索引].字段名获取数据。
q = Projects.objects.all()
q[0].name
Out[5]: '项目1'
q[1].tester
Out[6]: '小静2'
注意不支持负索引
q[-1].tester
Traceback (most recent call last):
File "C:\softwore\Python\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-7-177669c5e868>", line 1, in <module>
q[-1].tester
File "C:\softwore\Python\lib\site-packages\django\db\models\query.py", line 288, in __getitem__
"Negative indexing is not supported."
AssertionError: Negative indexing is not supported.
3. 可以进行切片操作
q[1:3]
Out[11]: <QuerySet [<Projects: 项目2>, <Projects: 项目哈哈>]>
q[:3]
Out[12]: <QuerySet [<Projects: 项目1>, <Projects: 项目2>, <Projects: 项目哈哈>]>
4. 可以进行遍历操作:
for i in q:
print(i)
项目1
项目2
项目哈哈
项目哈哈1
- model名称.objects.filter()
:返回满足条件的数据
#等价sql:select * from tb_projects where leader = '测试经理'
Projects.objects.filter(leader="测试经理")
Out[14]: <QuerySet [<Projects: 项目哈哈>, <Projects: 项目哈哈1>]>
- model名称.objects.exclude()
:返回满足条件之外的数据
#等价sql:select * from tb_projects where leader != '测试经理'
Projects.objects.exclude(leader="测试经理")
Out[15]: <QuerySet [<Projects: 项目1>, <Projects: 项目2>]>
- model名称.objects.order_by()
:返回排序后的结果
2. 返回一个特定对象的过滤器
- model名称.objects.get()
:返回一个model类,而不是str
Projects.objects.get(id=1)
Out[16]: <Projects: 项目1>
1.如果查询不到对应的结果, 则会抛出模型类.DoesNotExist异常
2.如果返回多条结果,则会抛出模型类.MultipleObjectsReturned异常
model名称.objects.count()
:返回满足查询结果的总条数
# 等价sql:select count(*) from tb_projects
Projects.objects.count()
Out[23]: 4
-
model名称.objects.aggregate()
:返回集合 -
model名称.objects.exists()
:判断返回的查询集中是否有数据,没有则False,有则True
Projects.objects.exists()
Out[28]: True
PS.
1.过滤器往往会和查询条件结合使用进行查询
2.一般情况用 model名称.objects,但也会指定对象,比如说polls.address.
查询集的特点
非立刻执行
1.创建查询集时,并不会访问数据库。而是直到模板中调用到数据时,才会进行数据库的访问。
缓存
1.查询集的结果会被保存下来,再次查询相同的数据时,会使用之前保存下来的结果数据
2.每个查询集都会有一个缓存空间来保存查询结果数据
3.切片和索引操作没有缓存可用,每次都会实际去执行sql语句
3. 使用特定过滤方法:
1. 包含过滤:
模型类属性名(字段名)__contains将包含指定字符串的所有记录包含
__icontains不区分大小写
Projects.objects.filter(leader__contains="测试经理a")
Out[30]: <QuerySet [<Projects: 项目哈哈>]>
Projects.objects.filter(leader__icontains="测试经理a")
Out[31]: <QuerySet [<Projects: 项目哈哈>, <Projects: 项目哈哈1>]>
2. 以xx开头或者结尾过滤:
Projects.objects.filter(leader__startswith="测试")
Out[33]: <QuerySet [<Projects: 项目哈哈>, <Projects: 项目哈哈1>]>
Projects.objects.filter(leader__endswith="a")
Out[34]: <QuerySet [<Projects: 项目哈哈>]>
3.获取查询集的第一个元素以及最后一个元素:first()、last()
4.isnull:是否为null
AddressInfo.objects.filter(pid__isnull = true) # 查询pid为null的地址
5.in:包含在范围内
AddressInfo.address.filter(id__in = [1,3]) # 查询id为1或3的地址
6.gt、gte、lt、lte:大于、大于等于、小于、小
7.exclude:条件以外的数据
AddressInfo.objects.filter(id__exclude = 1) # 查询id不为1的地址
8.year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行查询
BookInfo.objects.filter(pub_time__year = 2000) # 查询2000年发表的书籍
9.datetime.date
from datetime import date
books = BookInfo.objects.filter(pub_time__gt = date(2000,1,1)) # 查询2000年1月1号以后发布的书籍
10.多条件查询:或(使用|隔开查询条件)
BookInfo.objects.filter(id__gt = 1 | pub_time__year = 2000) # 查询id大于1或发布年份是2000年的数据
11.多条件查询:与(使用,隔开查询条件)
BookInfo.objects.filter(id__gt = 1 , pub_time__year = 2000) # 查询id大于1,并且发布年份是2000年的数据
12.链式查询:多个filter()进行查询(其它过滤器也可以这样)
BookInfo.objects.filter(id__gt = 1).filter(pub_time__year = 2000)
# 在查询id大于1的结果集上,再查询发布`年份是2000年的
13.获取查询集的第一个元素以及最后一个元素:first()、last()
BookInfo.objects.filter(id__gt = 1).first()
BookInfo.objects.filter(id__gt = 1).last()
14.排序order_by(‘字段/-字段’)
- 字段名称前面添加
-
代表从大到小排序 - 多个字段排序时候逗号隔开;
BookInfo.objects.filter(id__gt = 1).order_by('name') # 结果按照name排序,ascall码从小到大
BookInfo.objects.filter(id__gt = 1).order_by('-name') # 结果按照name排序,ascall码从大到小
BookInfo.objects.filter(id__gt = 1).order_by('id', 'name') # 结果先按照id排序,如果相同,则按照name排序
PS.
1.exact、contains、startswith、endswith这几个运算符都区分大小写,如需不区分大小写,只需要在前面加上i即可:iexact、icontains、istartswitch、iendswith
外键关联查询:
Projects.objects.filter(interfaces__name='登录接口')
Out[6]: <QuerySet [<Projects: 项目1>]>
Q查询:
#多个条件逗号分开为与的关系
Projects.objects.filter(leader="静静",tester="小静")
Out[7]: <QuerySet [<Projects: 项目1>]>
#使用Q和|变为或查询
from django.db.models import Q
Projects.objects.filter(Q(leader="静静") |Q(tester="静啊"))
Out[11]: <QuerySet [<Projects: 项目1>, <Projects: 项目2>, <Projects: 项目哈哈>]>