我如何进行以下查询(伪代码):
CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago
).sum('amount' * 'opportunities')
基本上,我想获得上述查询的金额*机会的总和。
答案 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
变量访问此值。