[英]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.