Python 这可以通过聚合实现吗?
我已经实现了我想要的,但我不相信这是最好的方法。这是我的模型:Python 这可以通过聚合实现吗?,python,django,python-3.x,Python,Django,Python 3.x,我已经实现了我想要的,但我不相信这是最好的方法。这是我的模型: class foo(models.Model): user = models.ForeignKey(User) rate = models.PositiveSmallIntegerField(default = 3) rate1 = models.PositiveSmallIntegerField(default = 3) rate2 = models.PositiveSmallIntegerFiel
class foo(models.Model):
user = models.ForeignKey(User)
rate = models.PositiveSmallIntegerField(default = 3)
rate1 = models.PositiveSmallIntegerField(default = 3)
rate2 = models.PositiveSmallIntegerField(default = 3)
我的看法是:
sum = {}
bad_rating = None
rate = foo.objects.values('user').distinct().annotate(r=Avg("rate"), r1 = Avg("rate1"), r2= Avg("rate2"))
for r in rate:
sum[r['user']]=r['r']+r['r1']+r['r2']
bad_rating = sorted(sum.items(), key=operator.itemgetter(1))
基本上,我得到了按不同用户分组的rate
、rate1
和rate2
的平均值。一旦获得了与不同用户关联的这三个字段的平均值,我想将它们全部添加到一起,并保持用户关联
在我的例子中,我在开始时有一个查询集,然后将其存储在字典中,然后将其存储在一个元组列表中(因为它允许我对其排序并获得最低评级或最高评级)
是否可以通过Django Queryset和聚合实现相同的结果
例如:
我的查询集结果:
<QuerySet [{'r': 1.0, 'r2': 3.0, 'user': 16, 'r3': 5.0}, {'r': 4.333333333333333, 'r2': 2.1666666666666665, 'user': 17, 'r3': 5.0}, {'r': 2.0, 'r1': 2.0, 'user': 18, 'r2': 2.0}]>
相反,我想要一个queryset,它将产生以下结果:
<QuerySet [{16: 5.4}, {17: 3.5}, {18: 4.0}]>
16
为用户id,5.4为avg(rate)+avg(rate1)+avg(rate2)
基于@9000条评论,我设法解决了问题:
rate = foo.objects.values('user').distinct().annotate(r=Avg("rate"), r1= Avg("rate1"), r2= Avg("rate2")).annotate(a = F('r')+F('r1')+F('r2')).order_by('a')[:5]
我现在唯一的问题是,它返回用户id,这很有用,但是如果它返回用户id会更方便,因此我可以在模板中直接使用它
谢谢,也许可以把它做成一个?我想知道
F()
是否可以接受像Avg
这样的其他表达式作为参数。@9000谢谢你的指导,如果我能做到的话,我会尝试并发布答案。