aggregate
除了count,默认是使用该属性加方法来命名返回结果的key值,但可以指定
Book.objects.count()
# 200
Book.objects.all().aggregate(Avg('price')) # Max
# {'price__avg': 34.45}
Book.objects.all().aggregate(price_avgnum=Avg('price')) # 指定了返回结果的字段名称
# {'price_avgnum': 34.45}
price_diff=Max('price', output_filed=FloatField()) - Avg('price')) # 可进行运算
Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
# {'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
annotate
pubs = Publisher.objects.annotate(num_books=Count('book'))
# pubs -> list
# pubs[0].num_books
同时拿count多值出来可能会有问题,即使用的是join而不是子查询。可以使用:
Book.objects.annotate(Count('authors', distinct=True), Count('store', distinct=True))
网友评论