【问题标题】:Django ORM: Count individual entries in related field with conditionDjango ORM:使用条件计算相关字段中的单个条目
【发布时间】:2018-11-25 06:54:31
【问题描述】:

我有一个模型Game 和一个模型LineLine 有一个指向 Game 的外键和一个名为 createdDateTimeField,它记录了该行的创建时间

我想对 Game 的查询集进行注释,以计算每个游戏中在特定日期之后创建的所有 Lines。

类似

games = Game.objects.all().annotate( recent_lines=Count(lines, filter=Q(lines__created__gt=date_to_check)))

这不起作用,因为它将所有行都视为有效...

我怎样才能实现我想要实现的目标?

【问题讨论】:

  • 你是什么意思它将所有行都视为有效?你的意思是它忽略了创建的日期条件,只计算所有的行,不管它们是否是在日期之后创建的?
  • 是的。 Count 的值最终只是游戏中的行数,与创建日期无关。

标签: django django-orm


【解决方案1】:

如果你想计算每场比赛的线数,你可以这样做

game = Game.objects.get(id=1)
 Line.objects.filter(game=game,created__gte=datetime.date(2018,2,12).count()

【讨论】:

  • 我不只是想计算行数,我还想对游戏进行注释,以便以后可以根据这个数字对它们进行排序。
【解决方案2】:

我怀疑问题在于您使用的 Django filter 到 Count 的参数(它基本上只是忽略它)。 filter 参数 was added in Django 2.0

For older versions of Django,你必须使用CaseWhen 条件表达式,不幸的是,这有点冗长,但应该可以完成这项工作。

from django.db.models import CharField, Case, When

games = Game.objects.all().annotate(
    recent_lines=Count(Case(
        When(recent_lines__created__gt=date_to_check, then=1), 
        output_field=CharField())))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2011-04-23
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多