首页 > 解决方案 > Django - 选择相关查询集字段的 MAX

问题描述

假设我有模型:

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

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

我想查询所有用户并使用事件计数和事件的最大值进行注释.timestamp

我知道我可以做到:

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

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

SELECT Users.*, MAX(Events.timestamp), COUNT(Events) FROM Users JOIN Events on Users.id = Events.user_id

标签: pythondjangodjango-orm

解决方案


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

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')
)

推荐阅读