Django 用空值注释字段

abo*_*nov 2 python django django-q django-annotate

Demand我有一个对象列表,这些对象的allocated字段要么是名称null,要么有一个名称(表示此需求的分配)。

我使用注释来计算每个团队已分配/未分配的数量:

Demand.objects.filter(project=project).values('team').annotate(
            unallocated=Count('allocated', filter=Q(allocated__isnull=True)),
            allocated=Count('allocated', filter=Q(allocated__isnull=False))
        )
Run Code Online (Sandbox Code Playgroud)

奇怪的是,注释的数字allocated显示正确,但 的数字unallocated始终为零。

例如:

list(Demand.objects.filter(project=project).values('allocated', 'team'))
Run Code Online (Sandbox Code Playgroud)

结果如下:

[{'allocated': None, 'team': 'Design'},
{'allocated': None, 'team': 'Engineering'},
{'allocated': None, 'team': 'Engineering'},
{'allocated': None, 'team': 'Engineering'},
{'allocated': None, 'team': 'Delivery'},
{'allocated': None, 'team': 'Product'}]
Run Code Online (Sandbox Code Playgroud)

但注释只有这样:

<QuerySet 
[{'team': 'Delivery', 'unallocated': 0, 'allocated': 0},
{'team': 'Design', 'unallocated': 0, 'allocated': 0},
{'team': 'Engineering', 'unallocated': 0, 'allocated': 0},
{'team': 'Product', 'unallocated': 0, 'allocated': 0}]>
Run Code Online (Sandbox Code Playgroud)

我做错了吗?或者这可能是一个错误?

Wil*_*sem 6

这是因为Count(\xe2\x80\xa6)\xc2\xa0 [Django-doc]不 count NULL,这就是 SQL 指定COUNT聚合如何工作的方式:它不考虑NULL值(例如也是这种情况AVG)。但您可以改为计算主键,例如:

\n
from django.db.models import Count, Q\n\nDemand.objects.filter(project=project).values(\'team\').annotate(\n    unallocated=Count(\'pk\', filter=Q(allocated=None)),\n    allocated=Count(\'allocated\', filter=Q(allocated__isnull=False))\n).order_by(\'team\')
Run Code Online (Sandbox Code Playgroud)\n

因此,您还可以简化allocated为:

\n
from django.db.models import Count, Q\n\nDemand.objects.filter(project=project).values(\'team\').annotate(\n    unallocated=Count(\'pk\', filter=Q(allocated=None)),\n    allocated=Count(\'allocated\')\n).order_by(\'team\')
Run Code Online (Sandbox Code Playgroud)\n