这可以通过汇总来实现吗? [英] Can this be achieved through Aggregation?

查看:126
本文介绍了这可以通过汇总来实现吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 类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 rate:
sum [r ['user']] = r ['r'] + r ['r1'] + r [ r2']
bad_rating = sorted(sum.items(),key = operator.itemgetter(1))

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



在我的情况下,我有一开始就是一个查询,然后把它存放在一个字典中,然后将它存储在一个tupple列表中(因为它允许我订购它并获得最低的评级或者最高的评价)。



可以通过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' }]> 

相反,我想要一个会产生以下结果的查询:

 < 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()。注释(r = Avg(rate),r1 = Avg(rate1),r2 = Avg(rate2))注释(a = F('r')+ F 'r1')+ F('r2'))。order_by('a')[:5] 

我现在唯一的问题是它返回的用户ID,这是有用的,但它会更方便,如果它返回用户,所以我可以直接在模板中使用它。



谢谢,


I have achieved what I want but I'm not convinced it is the best approach. This is my model:

class foo(models.Model):
    user = models.ForeignKey(User)
    rate = models.PositiveSmallIntegerField(default = 3)
    rate1 = models.PositiveSmallIntegerField(default = 3)
    rate2 = models.PositiveSmallIntegerField(default = 3)

This is my view:

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

Basically, I'm getting average of rate, rate1 and rate2 grouped by distinct users. Once I have gained the average of these three fields associated with distinct users, I want to add them all together, and keep the user association.

In my case, I have a queryset at the beginning, then I store it in a dictionary, then I store it in a tupple list (because it allows me to order it and gain the lowest rating, or highest rating).

Is it possible to achieve the same results through Django Queryset and aggregation?

In example: My Queryset result:

<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}]>

Instead I would like a queryset that would produce the following results:

<QuerySet [{16: 5.4}, {17: 3.5}, {18: 4.0}]>

16 being the user id, and 5.4 being avg(rate)+avg(rate1)+avg(rate2).

解决方案

Based on @9000 comment I manage to solve the problem:

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]

The only issue I have now is that it returns the user id, which is useful, but it would be much more convenient if it returned user instead, so I can use it directly in the template.

Thanks,

这篇关于这可以通过汇总来实现吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆