Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-选择相关查询集字段的最大值_Python_Django_Django Orm - Fatal编程技术网

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