簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM