当前位置: 首页 > 工具软件 > fq-book > 使用案例 >

django——ORM查询进阶,FQ聚合

裴姚石
2023-12-01

1.聚合
https://blog.csdn.net/cckavin/article/details/82454174

  • aggregate()
    为所有的QuerySet生成一个汇总值,相当于Count()。返回结果类型为Dict。
from django.db.models import Avg
Book.objects.all().aggregate(Avg('price'))
{'price__avg': 34.35}

# 价格最高的书和所有书的平均价格之间的差异。
>>> from django.db.models import FloatField
>>> Book.objects.aggregate(
...     price_diff=Max('price', output_field=FloatField()) - Avg('price'))
{'price_diff': 46.85}
  • annotate()
    为每一个QuerySet在指定属性上生成汇总值,相当于GROUP BY。返回结果类型QuerySet。
# 查询每个出版社所拥有的书的数量
>>> from django.db.models import Count
>>> pubs = Publisher.objects.annotate(num_books=Count('book'))
>>> pubs
<QuerySet [<Publisher: BaloneyPress>, <Publisher: SalamiPress>, ...]>
>>> pubs[0].num_books
73

2.django中的F查询和Q查询

  • Q查询——对对象的复杂查询,通常结合操作符使用
from django.db.models import Q

print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查询id=3或者标题是“Go”的书
print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J")))  # 查询价格大于等于70并且标题是“J”开头的书
print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查询标题是“J”开头并且id不是3的书
# Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))
  • F查询——取对象中某个字段的值进行操作
from django.db.models import F

Book.objects.update(price=F("price")+20)  # 对于book表中每本书的价格都在原价格的基础上增加20元
Student.objects.filter(age__gt=F('age2'))    # 和models自身的字段进行对比
 类似资料: