我有三个模型(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"))
不起作用。任何帮助非常感谢!
答案 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/