[英]Annotating query with sum of multiplication of two fields from a related model in Django
[英]Django Aggregation: Sum of Multiplication of two fields that are not in same model
我有三個模型(Django 1.6.5):
class Vote(models.Model):
voter = models.ForeignKey(UserSettings)
answer = models.ForeignKey(Answer)
rating = models.IntegerField()
class Answer(models.Model):
content = models.CharField(max_length=255)
class UserSettings(models.Model):
user = models.OneToOneField(User, related_name='settings')
weight = models.FloatField(default=1.0)
基本上,用戶(投票者)可以通過給出評分來為答案投票。 我知道如何通過回答來匯總評分:
Vote.objects.all().values('answer').annotate(score=Sum('rating'))
唯一的微妙之處在於,每個選民都有權重(所有選民都不相等!),我想對每個產品評分*權重求和。 我知道(從這里開始 )可以做類似的事情:
Sum('id',field="field1*field2")
如果我的2個字段位於同一模型中,則效果很好,但如果兩個字段不在同一模型中,則效果不佳。 換句話說,命令:
Vote.objects.all().values('answer').annotate(score=Sum('id',field="rating*voter__weight"))
不起作用。 任何幫助,不勝感激!
問題在於我們需要與另一個表(在本例中為UserSettings)進行聯接,因此我們需要“強制”聯接。
q = Vote.objects.all().filter(voter__settings__weight__gt=0).values("answer").annotate(Sum('id', field='rating*weight'))
為了強制連接,我使用了filter子句(實際上,我假設所有用戶的權重都大於0),但僅用於強制連接。 然后,您可以使用體重字段。
PD:我認為此問題已在最新版本的Django中通過條件表達式解決: https : //docs.djangoproject.com/es/1.10/ref/models/conditional-expressions/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.