繁体   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