1

我有这些模型:Django的平均标注的型号场

class Agency(models.Model): 
    pass 


class User(models.Model): 
    agency = models.ForeignKey(Agency) 


class Feedback(models.Model): 
    rating = models.DecimalField() 
    user = models.ForeignKey(User) 

,我想注释,平均收视所有的查询集。我预计这个工作:

Feedback.objects.annotate(avg_rating=Avg('rating')).values('rating', 'avg_rating') 

,但它只是输出这样的:

<QuerySet [{'rating': 0.8, 'avg_rating': 0.8}, {'rating': 0.2, 'avg_rating': 0.2}, {'rating': 0.6, 'avg_rating': 0.6}, {'rating': 1.0, 'avg_rating': 1.0}, {'rating': 0.4, 'avg_rating': 0.4}]> 

正如你所看到的平均值应为3.0。我哪里错了?

对于位清晰,我试图做这样的事情:

agencies = Agency.objects.annotate(
    avg_rating=Coalesce(Subquery(
     Feedback.objects.filter(user__agency_id=OuterRef('pk')) 
     .values('rating') 
     .annotate(avg_rating=Avg('rating', output_field=DecimalField())) 
     .values('avg_rating') 
    ), 0) 
) 

那里的平均评级是每个机构。有任何想法吗?

+0

你试图找出特定用户的平均评分?或者属于一个代理商的全部用户?你能用文字描述什么是用例? –

回答

1
Feedback.objects.aggregate(avg_rating=Avg('rating')) 
+0

我需要将它附加到每个实例。所以必须注释 –

+0

你能否给出代理和反馈之间的关系?外国人? –

+0

顶部的模型结构显示。 –

0

也许试试这个:

agencies = Agency.objects.annotate(
avg_rating=Coalesce(Subquery(
    Feedback.objects.values('user__agency') 
    .annotate(avg_rating=Avg('rating', output_field=DecimalField())) 
    .values('avg_rating') 
), 0)))