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

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自身的字段进行对比
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值