Django - Выберите МАКС поля соответствующего набора запросов - PullRequest
0 голосов
/ 16 марта 2020

Скажите, если у меня есть модели:

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

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

И я хочу опрашивать всех пользователей и аннотировать как с количеством событий, так и с MAX of Events.timestamp

Я знаю, для подсчета я могу do:

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

Но как мне сделать максимум для связанного поля набора запросов? Я хочу, чтобы это был один запрос, например:

SELECT Users. *, MAX (Events.timestamp), COUNT (Events) FROM Users JOIN События в Users.id = Events.user_id

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете использовать выражения запроса для достижения этой цели. Возможно, вам придется поиграться с именем, связанным с внешним ключом, в зависимости от вашего кода, но это приведет к чему-то похожему на это:

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')
)
0 голосов
/ 16 марта 2020

Вы можете попробовать составной запрос для этого следующим образом:

from django.db.models import Max

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

Подробнее об этом коде см. В Django документации здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...