鉴于以下关系:
class LicenseRequest:
license_type = models.ForeignKey(LicenseType)
created_at = models.DateField(default=now, editable=False)
class LicenseType:
name = models.CharField(max_length=100)
value = models.CharField(max_length=3, unique=True)
我想计算为每种许可证类型创建了多少个请求。但是,由于我正在生成图形,因此对于在该特定时期内没有任何许可证请求的许可证类型,我必须包含 0(零)。
我试着按照建议的做 here ,但它没有用。我只能从具有多个许可证请求的许可证类型中获取计数。
qs = LicenseType.objects.filter(
Q(licenserequest__created_at__range=(start_date, end_date)) | Q(licenserequest__isnull=True)
).annotate(rel_count=Count('licenserequest__id'))
我可以找到另一种方法来实现这个目标,但我想知道是否可以通过注释来实现。
我正在使用 django1.11.15 .
最佳答案
在 django-2.0和更高,Count
对象有一个 filter
参数,因此我们可以为此指定条件:
qs = LicenseType.objects.annotate(
rel_count=Count(
'licenserequest',
filter=Q(licenserequest__created_at__range=(start_date, end_date))
)
)
对于 django-1.11及以下,我们可以使用 Sum(..)
的 Case(..)
表达:qs = LicenseType.objects.annotate(
rel_count=Sum(Case(
When(
licenserequest__created_at__range=(start_date, end_date),
then=1
),
default=0,
output_field=IntegerField()
))
)
关于django - 没有关系时计数并返回零的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52290430/