Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ORM分别查询正负值之和_Django_Python 3.x_Django Orm - Fatal编程技术网

Django ORM分别查询正负值之和

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

我在数据库中有一列,我们称之为dummy_列。 它既有正值也有负值。 我想计算所有正数的和,以及所有负数的和,以及整个和(正+负),也就是说,我想输出3个单独的值

可以使用sum('dummy_column')计算两者之和

尝试使用Case和When,但无法理解在“then”子句中添加什么

看到这个答案相关,但我想避免“额外的”

没有太多的代码要写,所以没有。如有任何帮助,我们将不胜感激。

请使用三个聚合进行处理 您可以在
案例上使用
总和(…)
,如:

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)这个解决方案对我很有效,谢谢!