Django 聚合:两个不在同一个模块中的字段的乘积求和

2024-04-27 15:52:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三种型号(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)

基本上,一个用户(投票者)可以通过给出评级来投票支持一个答案。我知道如何通过回答来计算评分:

^{pr2}$

唯一微妙的是,每个选民都有自己的权重(所有选民都不平等!)我想把每个产品的额定值*重量相加。我知道(从here)这样的事情是可以做到的:

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

如果我的两个字段在同一个模型中,它会很好地工作,但是如果它们不在同一个模型中就不起作用了。换句话说,命令:

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

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


Tags: answeridfieldmodelmodelsclasssumvote
1条回答
网友
1楼 · 发布于 2024-04-27 15:52:51

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

相关问题 更多 >