Django根据相关对象排序查询集

时间:2014-01-30 19:12:10

标签: python django sorting

首先,中国新年快乐。

我遇到了这个问题,我正在寻找一种排序查询集的好方法:

有三个实体:Service, Order, Rating

Service对象可以有多个Order个对象,Order个对象只能有一个Rating个对象。 现在,我想根据平均值ServiceRating进行排名。

最直接的答案是: 首先查询Orders的所有Service并计算其平均值Rating,然后根据平均评分对Service进行排序。

然而,我担心效率和反应能力。

所以,我认为Service对象中应该有一个属性:Average_Rating。每次创建评论时,Average_Rating都会更新。

这种方法是提高响应能力的好方法吗?如果是这样,实施它的最佳方法是什么?谢谢。

1 个答案:

答案 0 :(得分:1)

如果您不想反规范化,可以使用annotation

假设您的模型类似于:

class Service(models.Model):
    name = models.CharField(max_length=5)

class Order(models.Model):
    name = models.CharField(max_length=5)
    service = models.ForeignKey(Service)

class Rating(models.Model):
    order = models.OneToOneField('Order')
    grade = models.IntegerField()

然后你可以按平均值进行注释和查询:

Service.objects.annotate(avg_rate=Avg('order__rating__grade')).order_by('avg_rate')