在Django orm中将两个字段相乘

2024-10-03 09:16:38 发布

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

如何执行以下查询(在伪代码中):

CueCompletion.objects.filter(
    user_id=profile_user.pk, status_action_taken_on__gte=day_ago
).sum('amount' * 'opportunities')

基本上,我想得到上面查询的amount*机会的总和。在


Tags: 代码idobjectsonstatusactionfilterprofile
2条回答

实现它的一种可能方法是使用名为values_list的Queryset方法。在

它返回一个特定的queryset(ValuesListQuerySet),然后您可以对它进行进一步的计算。在

您可以这样做:

vqs = CueCompletion.objects.filter( user_id=profile_user.pk, status_action_taken_on__gte=day_ago ).values_list('amount','opportunities')

然后您将得到类似vqs = [(50, 2), (100, 4), (25, 2), ...],即n元组的“列表”,每个元组的值都是amount机会字段。在

(实际上vqs它不是一个列表,它是一个ValuesListQuerySet,但对于我们的下一步操作没有关系)。在


我们的下一步(也就是进一步的计算)是:

total = sum(t[0] * t[1] for t in vqs)

在这里,我们在包含所有(amount*机会)结果的生成器上使用build itsum()函数。在

(为什么要使用生成器而不是列表理解?检查this answer!)在

您还可以在使用F对象时向queryset添加注释。这样您就可以在数据库中进行所有的计算,这可能比将所有值拉到一个列表中并使用python内存进行列表理解要快得多。在

CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago
).annotate(total=F('amount') * F('opportunities'))

现在您可以通过total变量访问这个值。在

相关问题 更多 >