在django orm中将两个字段相乘

时间:2015-02-23 18:18:06

标签: python mysql django

我如何进行以下查询(伪代码):

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

基本上,我想获得上述查询的金额*机会的总和。

2 个答案:

答案 0 :(得分:2)

实现它的一种可能方法是使用名为values_list的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), ...]的内容,即"列表" of n 元组,每个元组的值为 amount opportunity 字段。

(实际上vqs它不是列表,它是一个ValuesListQuerySet,但对我们的下一步行动并不重要。)


我们的下一步行动(a.k.a.进一步的计算)是:

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

我们在包含所有(金额 * 商机)结果的生成器上使用内置sum()函数。

(为什么使用生成器代替列表推导?检查this answer!)

答案 1 :(得分:0)

您还可以在使用F对象时向查询集添加注释。这样你就可以在数据库中进行所有计算,这可能比将所有值都拉到列表中并使用python内存进行列表理解更快。

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

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