Django ORM分别查询正负值之和
我在数据库中有一列,我们称之为dummy_列。 它既有正值也有负值。 我想计算所有正数的和,以及所有负数的和,以及整个和(正+负),也就是说,我想输出3个单独的值 可以使用sum('dummy_column')计算两者之和 尝试使用Case和When,但无法理解在“then”子句中添加什么 看到这个答案相关,但我想避免“额外的” 没有太多的代码要写,所以没有。如有任何帮助,我们将不胜感激。请使用三个聚合进行处理 您可以在Django ORM分别查询正负值之和,django,python-3.x,django-orm,Django,Python 3.x,Django Orm,我在数据库中有一列,我们称之为dummy_列。 它既有正值也有负值。 我想计算所有正数的和,以及所有负数的和,以及整个和(正+负),也就是说,我想输出3个单独的值 可以使用sum('dummy_column')计算两者之和 尝试使用Case和When,但无法理解在“then”子句中添加什么 看到这个答案相关,但我想避免“额外的” 没有太多的代码要写,所以没有。如有任何帮助,我们将不胜感激。请使用三个聚合进行处理 您可以在案例上使用总和(…),如: from django.db.models im
案例上使用总和(…)
,如:
from django.db.models import Case, F, IntegerField, Sum, Value, When
agg = SomeModel.objects.aggregate(
total=Sum('value'),
total_pos=Sum(Case(
When(value__gt=0, then=F('value')),
default=Value(0),
output_field=IntegerField()
)),
total_neg=Sum(Case(
When(value__lt=0, then=F('value')),
default=Value(0),
output_field=IntegerField(),
))
)
(使用SomeModel
我们要计算其聚合的模型,以及value
字段(这里是一个IntegerField
,其中包含我们要求和的值)
因此,When(…)
对象指定我们为value\uuu gt=0
(值大于零)或value\uu lt=0
(值小于零)的行传递值
这将生成一个包含三个键的字典,例如:
# sample output
agg == {'total': 12, 'total_pos': 14, 'total_neg': -2}
因此,您可以获取如下值:
agg['total'] # 12
采用两种骨料的工艺
然而,由于我们知道agg['total']==agg['total\u pos']+agg['total\u neg']
,我们只能计算其中一个元素,并对字典进行后期处理,如:
from django.db.models import Case, F, IntegerField, Sum, Value, When
agg = SomeModel.objects.aggregate(
total=Sum('value'),
total_pos=Sum(Case(
When(value__gt=0, then=F('value')),
default=Value(0),
output_field=IntegerField()
))
)
agg['total_neg'] = agg['total'] - agg['total_pos']
从django.db.models导入Case,F,IntegerField,Sum,Value,When
agg=SomeModel.objects.aggregate(
总计=总和(“值”),
总数=总和(案例)(
当(value_ugt=0,则=F('value'))时,
默认值=值(0),
输出\字段=整数字段()
))
)
agg['total_neg']=agg['total']-agg['total_pos']
这可能更有效,因为我们避免了额外检查每一行(尽管这取决于数据库如何进行索引等)。您的代码缺少一些逗号……而且我无法让输出字段被接受?agg=SomeModel.objects.aggregate(total=Sum('value'),total_pos=Sum(Case)(当(value\uu gt=0,then=F('value')),default=value(0))@BenjaminSchollnick:谢谢,我添加了逗号。在你的例子中,你用什么字段来表示value
?我用了一个名为display\u size的字段,其中的大小是文件的大小…(其中-1表示不存在)因此,只想对正值求和…display_size=models.BigIntegerField(默认值=-1,db_index=True)这个解决方案对我很有效,谢谢!