Django - ORM查询


详情:

https://docs.djangoproject.com/en/3.0/ref/models/querysets/
https://docs.djangoproject.com/zh-hans/3.0/topics/db/queries/

查询的对象有两种一种是直接查询项目object, 一种是查询QuerySet。

QuerySet特点:

  1. 惰性查询
  2. 可迭代
  3. 可切片
  4. 可索性,但是索引不能为负数

常见查询:

  • get(**kwargs) 返回object, 事实具体查询,如果查出多个object或者没有查到都会报错,可以用异常捕捉进行调试
  • all() 查询所有结果
  • filter(**kwargs)返回QuerySet, 条件查询
  • exclude(**kwargs) 与filter相反,返回条件不同的结果
  • order_by(*fileds) 对查询结果排序
  • reverse() 对查询结果反向排列
  • distinct() 返回结果中剔除重复记录
  • values(*fileds) 返回一个valueQuerySet, 内容以为字典的形式
  • values_list(*fileds) 返回alueQuerySet, 内容以元组的形式
  • count()返回QuerySet中查询匹配的数目
  • first()返回第一条记录,等价于[:1][0]
  • last()返回最后一条记录, 等价于[::-1][0]
  • exists() 如果QuerySet中有数据返回True, 否则返回False

多表查询:

  • __xx, 可以使用__xxx使用双下划线对属性进行直接显示, 可用内连接与外连接。
  • _set, 提供某一个对象访问set的数据表,是主键类关联外键类型。ForeignKey. 主键就是多对1的那个1, 外键就是那个多。

聚集查询和分组查询:

  1. annotate(*args, **kwargs), 以QuerySet集合对象添加注释, 通过集合中每个关联对象集合。用于分组查询
  2. aggregate(*args, **kwargs), 返回一个聚合值的字典。

聚集查询和分组查询都在from django.db.models import Count

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db.models import Sum

# 对于所有书的价格求和
Book.objects.aggregate(Sum('prices'))
# 或者使用kwargs, key就是显示的key, values = Sum("prices")
Book.objects.aggregate(boo_all_prices=Sum('prices'))
# 或者对单独一组的数据进行求和
Book.objects.filter(publisher__name="成都工业").aggregate(Sum('prices'))


# 首先利用values函数进行分组,然后再利用annotate进行分组求和
Book.objects.values("publisher").annotate(Sum('prices'))

# 求每个出版社出的书的总的价格
# 对出版社进行分组,在对价格求和
Book.objects.values("publisher__name").annotate(Sum("prices"))

此外还一颗使用原生sql语句进行查询:

详情:

https://docs.djangoproject.com/zh-hans/3.0/ref/models/querysets/#extra
https://docs.djangoproject.com/zh-hans/3.0/ref/models/querysets/#raw

比如extra(), 和raw()