当没有关系时进行计数并返回零的注释

Ev.*_*Ev. 4 django django-queryset

给定以下关系:

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)
Run Code Online (Sandbox Code Playgroud)

我想计算为每种许可证类型创建了多少个请求。但是,由于我正在生成图形,因此对于在该特定时间段内没有任何许可证请求的许可证类型,我必须包含 0(零)。

我尝试按照此处的建议进行操作,但没有成功。我只能从具有多个许可证请求的许可证类型中获取计数。

qs = LicenseType.objects.filter(
                Q(licenserequest__created_at__range=(start_date, end_date)) | Q(licenserequest__isnull=True)
            ).annotate(rel_count=Count('licenserequest__id'))
Run Code Online (Sandbox Code Playgroud)

我可以找到另一种方法来实现这个目标,但我想知道是否可以通过注释来做到这一点。

我正在使用

Wil*_*sem 6

及更高版本中,该Count对象有一个filter参数,因此我们可以指定其条件:

qs = LicenseType.objects.annotate(
    rel_count=Count(
        'licenserequest',
        filter=Q(licenserequest__created_at__range=(start_date, end_date))
    )
)
Run Code Online (Sandbox Code Playgroud)

对于及以下版本,我们可以使用 ofSum(..)表达式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()
    ))
)
Run Code Online (Sandbox Code Playgroud)