【问题标题】:Can this be achieved through Aggregation?这可以通过聚合来实现吗?
【发布时间】:2017-03-09 04:38:37
【问题描述】:

我已经实现了我想要的,但我不相信这是最好的方法。这是我的模型:

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))

基本上,我得到了按不同用户分组的 raterate1rate2 的平均值。一旦我获得了与不同用户关联的这三个字段的平均值,我想将它们加在一起,并保持用户关联。

就我而言,我在开头有一个查询集,然后将其存储在字典中,然后将其存储在元组列表中(因为它允许我对其进行排序并获得最低评分或最高评分)。

通过 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 [{16: 5.4}, {17: 3.5}, {18: 4.0}]>

16是用户ID,5.4是avg(rate)+avg(rate1)+avg(rate2)

【问题讨论】:

  • 或许可以做成query expression?我想知道F() 是否可以接受像Avg 这样的其他表达式作为参数。
  • @9000 感谢您的指导,如果可以的话,我会尝试并发布答案。

标签: python django python-3.x


【解决方案1】:

根据@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,这很有用,但是如果它返回用户会更方便,所以我可以直接在模板中使用它。

谢谢,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多