2016-09-20 79 views
0

我有三個型號(Django的1.6.5)的乘法和:Django的聚合:兩個字段不在同一型號

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

唯一的微妙之處在於每個選民的重量(所有選民是不相等的!),我要總結每個產品的評價*重。我知道(從here)是類似的東西可以做到:

Sum('id',field="field1*field2") 

和它的工作好,如果我的2場是在同一個模型,但是如果他們沒有它不工作。換句話說,命令:

Vote.objects.all().values('answer').annotate(score=Sum('id',field="rating*voter__weight")) 

不起作用。任何幫助非常感謝!

回答

0

問題是我們需要與另一個表(在本例中爲UserSettings)的連接,所以我們需要「強制」連接。

q = Vote.objects.all().filter(voter__settings__weight__gt=0).values("answer").annotate(Sum('id', field='rating*weight')) 

要強制我使用的過濾條款(其實我想,所有用戶都具有重量大於0),但只是用來強制聯接聯接。然後你可以使用權重字段。

PD:我認爲這個問題是在條件表達式最新版本的Django的解決:https://docs.djangoproject.com/es/1.10/ref/models/conditional-expressions/