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.