django之聚合查询,分组查询,F查询和Q查询

一,聚合查询

需要先在文档的上面导入(在其他需要使用聚合查询的时候都需要导入):

from django.db.models import Avg,Count,Max,Min,Sum

聚合查询aggregate

aggregate()是QuerySet 的一个终止子句:意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

# 聚合查询 aggregate
    from django.db.models import Max,Min,Count,Avg,Sum
    # 计算所有图书的平均价格
    ret = Book.objects.all().aggregate(Avg('price'))
    print(ret)
    # 计算所有图书的最高价格
    ret = Book.objects.aggregate(Max('price'))
    print(ret)
    # 计算图书的最高价格,最低价格,平均价格,总数和总和
    ret = Book.objects.aggregate(Avg('price'),Max('price'),Min('price'),Sum('price'),Count('price'))
    print(ret)

二,分组查找

分组查询(以谁做分组,就以谁做基表)annotate()

总结:values()出现在annotate()之前,相当于mysql中的,order by.values()出现在annotate()之后相当于取值

       filter()出现在annotate()之前,相当于mysql中的,where.values()出现在annotate()之后相当于mysql中的,having

# 分组查询 annotate()
    # 统计每一本书作者的个数
    ret = Book.objects.all().annotate(c=Count('authors'))
    print(ret)
    for r in ret:
        print(r.name, '---->', r.c)
    ret = Book.objects.all().annotate(c=Count('authors')).values('name', 'c')
    print(ret)
    # 统计每个出版社的最便宜的书
    ret = Publish.objects.all().annotate(c=Min('book__price')).values('name', 'c')
    print(ret)
    # 统计不止一个作者的图书
    ret = Book.objects.all().annotate(c=Count('authors')).filter(c__gt=1).values('name')
    print(ret)

三,F查询

F为了字段=后面的值,不能放字段,所以用F函数包裹

# F查询
    from django.db.models import F
    # 把所有图书的价格加1
    ret = Book.objects.all().update(price=F('price')+1)
    print(ret)

四,Q函数

Q为了构造与&,或|,非~的关系

# Q函数
    from django.db.models import Q
    # 查询作者的名字为鲁迅或者巴金的书
    ret = Book.objects.filter(Q(authors__name='鲁迅')|Q(authors__name='巴金')).values('name')
    print(ret)
    # 查询作者不是鲁迅的书
    ret = Book.objects.filter(~Q(authors__name='鲁迅')).values('name')
    print(ret)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值