具有一定条件的Django计数相关对象

具有一定条件的Django计数相关对象,django,django-models,django-annotate,django-aggregation,Django,Django Models,Django Annotate,Django Aggregation,我的django应用程序中有以下模型类: class Ad(models.Model): ... class Click: time = models.DateTimeField(auto_now_add=True) ip = models.GenericIPAddressField() ad = models.ForeignKey( to=Ad, related_name='views', on_delete=C

我的django应用程序中有以下模型类:

class Ad(models.Model):
    ...

class Click:
    time = models.DateTimeField(auto_now_add=True)
    ip = models.GenericIPAddressField()
    ad = models.ForeignKey(
        to=Ad,
        related_name='views',
        on_delete=CASCADE
    )

class View:
    time = models.DateTimeField(auto_now_add=True)
    ip = models.GenericIPAddressField()
    ad = models.ForeignKey(
        to=Ad,
        related_name='views',
        on_delete=CASCADE
    )
假设我有一个
Ad
对象的查询集。我想为12到13小时内发生的每一次添加添加的点击次数添加注释(我们可以使用
range
look-up)。首先我是这样做的:

query.filter(clicks__time__hour__range=[12, 13]).annotate(views_count=Count('views',distinct=True), clicks_count=Count('clicks', distinct=True))
但是在该范围内没有任何点击的广告将以这种方式从查询中删除,但我需要它们出现在最终查询中。

使用Django条件表达式是否有合适的方法可以做到这一点?

根据,您应该能够在
计数
聚合中进行筛选

from django.db.models import Count, Q
query.annotate(
    views_count=Count('views',distinct=True),
    clicks_count=Count('clicks', distinct=True, filter=Q(time__hour__range=[12, 13])),
)