使用 annotate() 函数代替 aggregate() 函数来避免额外的查询操作。annotate() 函数将聚合结果添加到原查询集上而不是使用单独的查询。
示例代码:
假设我们有一个 Blog 和 Comment 模型。我们想获取每个 Blog 的评论总数和最新评论的创建时间。
错误的做法:
from django.db.models import Count, Max
blogs = Blog.objects.all().aggregate(
comment_count=Count('comment'),
latest_comment=Max('comment__created_at')
)
这个示例中使用了 aggregate() 函数,它会产生额外的查询操作。正确的做法如下:
from django.db.models import Count, Max
blogs = Blog.objects.all().annotate(
comment_count=Count('comment'),
latest_comment=Max('comment__created_at')
)
这个示例中使用了 annotate() 函数,它会将聚合结果添加到原查询集上而不是使用单独的查询。这样可以避免额外的查询操作。