Агрегировать по максимуму другого поля - PullRequest
1 голос
/ 30 марта 2020

Эй, у меня есть модель с именем Visit. С полями date, person, id. Я хочу, чтобы все люди, которые не посещали в течение последних трех месяцев. Можете ли вы помочь мне, пожалуйста?

Что у меня есть до сих пор. Результаты не то, что я хотел увидеть.

visits_anotated = Visit \
    .objects \
    .only('id', 'date', 'person') \
    .values('id', 'date', 'person') \
    .annotate(latest_visit=Max('date')) \
    .filter(latest_visit__lte=datetime.datetime.now() - datetime.timedelta(weeks=14)) 

1 Ответ

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

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

three_months_ago = datetime.datetime.now() - datetime.timedelta(weeks=14)
recent_people = Visit.objects.filter(
    date__gte=three_months_ago
).values('person').distinct()
earlier_people = Visit.objects.exclude(
    person__in=recent_people
).values('person').distinct()

Если у человека был внешний ключ, вы можете сделать следующее:

Person.objects.exclude(visit_set__date__gte=three_months_ago).distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...