2024-10-03 09:16:38 发布
网友
如何执行以下查询(在伪代码中):
CueCompletion.objects.filter( user_id=profile_user.pk, status_action_taken_on__gte=day_ago ).sum('amount' * 'opportunities')
基本上,我想得到上面查询的amount*机会的总和。在
实现它的一种可能方法是使用名为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 = [(50, 2), (100, 4), (25, 2), ...]
(实际上vqs它不是一个列表,它是一个ValuesListQuerySet,但对于我们的下一步操作没有关系)。在
vqs
我们的下一步(也就是进一步的计算)是:
total = sum(t[0] * t[1] for t in vqs)
在这里,我们在包含所有(amount*机会)结果的生成器上使用build itsum()函数。在
(为什么要使用生成器而不是列表理解?检查this answer!)在
您还可以在使用F对象时向queryset添加注释。这样您就可以在数据库中进行所有的计算,这可能比将所有值拉到一个列表中并使用python内存进行列表理解要快得多。在
F
CueCompletion.objects.filter( user_id=profile_user.pk, status_action_taken_on__gte=day_ago ).annotate(total=F('amount') * F('opportunities'))
现在您可以通过total变量访问这个值。在
total
实现它的一种可能方法是使用名为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内存进行列表理解要快得多。在现在您可以通过
total
变量访问这个值。在相关问题 更多 >
编程相关推荐