Django: Получение последней записи до определенной даты для всех заданных пользователей

Итак, у меня есть таблица, которая выглядит примерно так

user_id value date_created
1 10 2022-8-14
2 11 2022-8-14
3 12 2022-8-14
1 13 2022-8-15
2 14 2022-8-15
3 15 2022-8-15
1 10 2022-8-16
2 11 2022-8-16
3 12 2022-8-16

Я хочу найти последнюю запись до определенной даты для заданных пользователей. Следующий запрос фильтрует все записи для заданных пользователей до определенной даты.

UserData.objects.filter(user_id__in=user_list, date_created__lte=start_date)

Как мне модифицировать этот запрос, чтобы получить только последние строки перед датой начала для каждого пользователя. Например, если дата начала 15 августа, он должен выдать строки с 4 по 6 из таблицы.

PS: Дата создания - это упрощение, это должно быть время, и может быть несколько значений в каждый день для одних и тех же пользователей.

Полагаю, у вас есть отдельная модель user, верно? Это звучит как greatest-n-per-group вопрос, посмотрите этот ответ:

Запрос Django, который получает самые последние объекты из разных категорий

Если ваш бэкенд базы данных - PostgreSQL, Django поддерживает указание полей в формате .distinct

UserData.objects.filter(user_id__in=user_list, date__created__lte=start_date)\
    .order_by('user_id', '-date').distinct('user_id')

Если это не так, обратитесь к @Patrick H.

Вернуться на верх