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)
我做错了吗?或者这可能是一个错误?
这是因为Count(\xe2\x80\xa6)\xc2\xa0 [Django-doc]不 count NULL,这就是 SQL 指定COUNT聚合如何工作的方式:它不考虑NULL值(例如也是这种情况AVG)。但您可以改为计算主键,例如:
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为:
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