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