有没有办法指定(在注释或聚合中)将一系列 F
表达式求和在一起,而无需手动键入 F("first_prop") + F("secondary_prop") + ...
?
我想要类似于 python 的 sum()
函数允许您传递可迭代对象并获取可迭代对象中值的总和,即 sum([1,2,3] )
返回 6
。
具体来说,我想要看起来像这样的东西:
class Tree(TimeStampedModel):
leaf_count = models.IntegerField()
branch_count = models.IntegerField()
Tree.objects.create(leaf_count=60, branch_count=8)
Tree.objects.create(leaf_count=30, branch_count=3)
# now I want to annotate a combined count using my imaginary IterableSum aggregator
combined_sums = list(
Tree.objects.all().annotate(
combined_count=IterableSum(fields=[F("leaf_count"), F("branch_count")])
).values_list("combined_count", flat=True)
)
combined_sums # [68, 33]
我怎样才能实现这个目标?
最佳答案
sum
的唯一问题是它以 0
开头作为初始值。您可以使用 functools
中的 reduce
:
from functools import reduce
from operator import add
from django.db.models import F
combined_sums = list(
Tree.objects.values(
combined_count=reduce(add, [F('leaf_count'), F('branch_count')]),
flat=True,
)
)
虽然严格来说,这甚至没有必要,但您可以只使用 sum
,因为它会将 0
与 F('leaf_count')
:
from django.db.models import F
combined_sums = list(
Tree.objects.values(
combined_count=sum([F('leaf_count'), F('branch_count')]),
flat=True,
)
)
那么查询中将会有一个+ 0
,这可能并不理想。
这是因为 sum
不仅对整数求和,事实上,您可以例如对 F
对象求和:
In [11]: sum([F('foo'), F('bar')])
Out[11]: <CombinedExpression: Value(0) + F(foo) + F(bar)>
关于python - F 表达式列表的求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75664215/