首先,中国新年快乐。
我遇到了这个问题,我正在寻找一种排序查询集的好方法:
有三个实体:Service, Order, Rating
。
Service
对象可以有多个Order
个对象,Order
个对象只能有一个Rating
个对象。
现在,我想根据平均值Service
对Rating
进行排名。
最直接的答案是:
首先查询Orders
的所有Service
并计算其平均值Rating
,然后根据平均评分对Service
进行排序。
然而,我担心效率和反应能力。
所以,我认为Service
对象中应该有一个属性:Average_Rating
。每次创建评论时,Average_Rating
都会更新。
这种方法是提高响应能力的好方法吗?如果是这样,实施它的最佳方法是什么?谢谢。
答案 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')