Python Django-选择相关查询集字段的最大值
如果我有模型:Python Django-选择相关查询集字段的最大值,python,django,django-orm,Python,Django,Django Orm,如果我有模型: class User(models.Model): name = ... dob = ... class Event(models.Model): user = models.ForeignKey(User, ...) timestamp = models.DateTimeField() 我想查询所有用户,并用事件数和最大事件数进行注释。timestamp 我知道我可以做到: Users.objects.all().annotate(event
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'))
但如何处理相关queryset字段的最大值?我希望它是一个单一的查询,如:
选择Users.*、MAX(Events.timestamp)、COUNT(Events)
来自用户加入Users.id=Events.user\u id上的事件
你可以用它来实现这一目标。根据代码的不同,您可能需要使用与外键相关的名称,但这样会导致如下结果:
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')
)
你可以用它来实现这一目标。根据代码的不同,您可能需要使用与外键相关的名称,但这样会导致如下结果:
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')
)
您可以按如下方式尝试对此进行聚合查询:
from django.db.models import Max
Users.objects.all().aggregate(Max('Events.timestamp'))
请参见Django文档中的上述代码的详细信息。您可以按如下方式尝试对其进行聚合查询:
from django.db.models import Max
Users.objects.all().aggregate(Max('Events.timestamp'))
有关上述代码的详细信息,请参见Django文档中的您可以在查询时使用
.annotate
和.aggregate
,如Users.objects.all().annotate().annotate()
您可以在查询时使用.annotate
和.aggregate
,如Users.objects.all().annotate().annotate().annotate()
这只会得到一个结果,即max Events.timestamp值,而不是一系列带注释的用户对象。语法也应该是双下划线而不是点?这只会得到一个结果,即max Events.timestamp值,而不是一系列带注释的用户对象。此外,语法应该是双下划线而不是点?Ok,这样您就可以将字段名链接到反向相关查询集。。这难道不会简化为Max('event\u set\u timestamp')?是的,因为您不使用字段执行任何其他操作,所以只需调用Max('event\u set\u timestamp')
。这样您就可以将字段名链接到反向相关的查询集上。。这难道不会简化为Max('event\u set\u timestamp')?是的,因为您不使用字段执行任何其他操作,所以它也可以调用Max('event\u set\u timestamp')
。