【问题标题】:Django Counting related object with a certain condition具有特定条件的 Django 计数相关对象
【发布时间】:2020-11-17 21:39:19
【问题描述】:

我的 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 查找)。首先我是这样做的:

query.filter(clicks__time__hour__range=[12, 13]).annotate(views_count=Count('views',distinct=True), clicks_count=Count('clicks', distinct=True))

但是那些在该范围内没有任何点击的广告将以这种方式从查询中省略,但我需要它们出现在最终查询中。

是否有任何适当的方法可以使用 Django 条件表达式?

【问题讨论】:

    标签: django django-models django-annotate django-aggregation


    【解决方案1】:

    根据docs,您应该能够在Count 聚合中进行过滤。

    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])),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 2020-07-23
      • 2015-12-30
      • 2014-11-29
      • 2017-07-10
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多