Python 以django形式将两个字段相乘
如何执行以下查询(伪代码):Python 以django形式将两个字段相乘,python,mysql,django,Python,Mysql,Django,如何执行以下查询(伪代码): 基本上,我想获得上述查询的amount*opportunities的总和。实现它的一种可能方法是使用一个名为的Queryset方法 它返回一个特定的查询集(ValuesListQuerySet),然后您可以对其进行进一步的计算 您可以这样做: vqs=cuepletion.objects.filter( 用户id=profile\u user.pk,状态\u行动\u在\u gte=day\u采取 ).价值清单(“金额”、“机会”) 然后你会有类似于vqs=[(50,
基本上,我想获得上述查询的amount*opportunities的总和。实现它的一种可能方法是使用一个名为的Queryset方法 它返回一个特定的查询集(ValuesListQuerySet),然后您可以对其进行进一步的计算 您可以这样做:
vqs=cuepletion.objects.filter(
用户id=profile\u user.pk,状态\u行动\u在\u gte=day\u采取
).价值清单(“金额”、“机会”)
然后你会有类似于vqs=[(50,2),(100,4),(25,2),…])
的东西,即一个由n个元组组成的“列表”,每个元组都有amount和opportunities字段的值
(实际上,vqs
它不是一个列表,它是一个ValuesListQuerySet,但对于我们的下一步行动来说并不重要)
我们的下一步(即进一步计算)是:
total=sum(对于vqs中的t,t[0]*t[1])
我们在包含所有(数量*机会)结果的生成器上使用内置函数
(为什么使用生成器而不是列表理解?检查!)您还可以在使用
F
对象时向查询集添加注释。通过这种方式,您可以在数据库中进行所有计算,这可能比将所有值拉入列表并使用python内存进行列表理解要快
CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago
).annotate(total=F('amount') * F('opportunities'))
现在,您可以通过
total
变量访问此值。您应该为此解决方案获得奖牌。这太棒了,我们从django.db.models import F寻找了一个多小时的完美解决方案
CueCompletion.objects.filter(
user_id=profile_user.pk, status_action_taken_on__gte=day_ago
).annotate(total=F('amount') * F('opportunities'))