Django Aggregation:两个不在同一模型中的字段的乘法和

时间:2016-09-20 15:18:53

标签: python django aggregate django-queryset

我有三个模型(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'))

唯一的微妙之处在于每个选民都有一个权重(所有选民都不相等!)我希望将每个产品评级*权重相加。我知道(来自here)可以做到这样的事情:

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

如果我的2个字段属于同一个模型,它会很好用,但如果它们没有,它就无法工作。换句话说,命令:

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

不起作用。任何帮助非常感谢!

1 个答案:

答案 0 :(得分:0)

问题是我们需要与另一个表(在本例中为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/