from django.db.models import Avg, Count, Max, Min, Sum
from django.db.models import F
from django.db.models import Aggregate, QuerySet
# 假设我们有一个模型 `Book`,包含字段 `rating` 和 `price`
class Book(models.Model):
rating = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
# 使用聚合函数获取图书的平均评分和最高价格
def get_book_stats():
book_stats = Book.objects.aggregate(
average_rating=Avg('rating'),
max_price=Max('price')
)
return book_stats
# 使用 F 表达式和聚合函数计算每本书的价格与评分的乘积的总和
def get_total_rating_price():
total_rating_price = Book.objects.aggregate(
total_value=Sum(F('price') * F('rating'), output_field=models.DecimalField())
)
return total_rating_price
# 使用annotate()结合聚合函数,对查询集中的每本书计算平均评分
def get_average_rating_per_book():
books = Book.objects.annotate(average_rating=Avg('rating')).all()
return books
这个例子展示了如何在Django中使用聚合函数(Avg, Max, Min, Sum)和 F 表达式来对模型进行复杂的数据查询。代码中的 aggregate()
方法适用于整个查询集,计算所有书的全局统计数据。而 annotate()
方法则是对查询集中每个对象添加额外的字段,这里是每本书的平均评分。