【问题标题】:Django - Select MAX of field of related query setDjango - 选择相关查询集字段的 MAX
【发布时间】:2020-03-16 06:09:52
【问题描述】:

如果我有模型,请说:

class User(models.Model):
    name = ...
    dob = ...

class Event(models.Model):
    user = models.ForeignKey(User, ...)
    timestamp = models.DateTimeField()

我想查询所有用户并使用 Count of events 和 MAX of Events.timestamp 进行注释

我知道我能做到:

Users.objects.all().annotate(event_count=models.Count('event_set'))

但是我如何做一个相关的查询集字段的最大值?我希望它是一个查询,例如:

SELECT Users.*, MAX(Events.timestamp), COUNT(Events) FROM 用户在 Users.id = Events.user_id 上加入事件

【问题讨论】:

  • 您可以在查询中使用.annotate.aggregate,例如Users.objects.all().annotate().annotate()

标签: python django django-orm


【解决方案1】:

您可以使用Query Expressions 来实现这一点。根据您的代码,您可能必须使用与外键相关的名称,但这会导致如下所示:

from django.db.models import Count, F, Func,

Users.objects.all().annotate(
    event_count=Count('event_set'), 
    max_timestamp=Func(F('event_set__timestamp'), function='MAX')
)

【讨论】:

  • 好的,您可以将字段名称链接到与反向相关的查询集上。这不是简化为 Max('event_set__timestamp') 吗?
  • 是的,因为您不使用这些字段执行任何其他操作,所以只需调用 Max('event_set__timestamp') 也应该可以工作。
【解决方案2】:

您可以尝试如下聚合查询:

from django.db.models import Max

Users.objects.all().aggregate(Max('Events.timestamp'))

以上代码详见Django文档here

【讨论】:

  • 这只会得到一个结果,即最大 Events.timestamp 值,而不是带注释的用户对象序列。语法也应该是双下划线而不是点?
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 2013-10-23
  • 2012-01-01
  • 2018-06-02
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多