19. Django_ORM_数据查询

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为13的地址

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))  # 查询200011号以后发布的书籍

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: 项目哈哈>]>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章