Django ORM фильтрует по списку и затем получает последний созданный элемент
Как написать наиболее эффективный запрос Django ORM для следующего сценария? Мне нужно получить элементы на основе списка accountIds, но это вернет дубликаты записей с одинаковым accountId, потому что accountId не является первичным ключом. Затем мне нужно удалить дубликаты, возвращая только последнюю созданную запись в наборе запросов. Я могу использовать цикл for для просмотра списка accountId и фильтрации по каждому accountId, а затем упорядочить по дате создания и получить последнюю запись. Однако при таком подходе я буду обращаться к базе данных очень много раз. Существует более 200 идентификаторов счетов
Есть ли более эффективные способы сделать это?
Это может быть полезно
Model.objects.order_by('date_created').distinct()
docs: distinct в django queryset если вы используете postgres, это будет очень полезно и эффективно
При использовании PostgreSQL вы можете добавить имя поля к distinct(), чтобы создать SELECT DISTINCT ON (foo) запрос, который возвращает первое уникальное значение для этого поля. В вашем случае, если вы упорядочите по account_id, а затем по убыванию created_date, вы получите один ряд на account_id, который имеет последнее created_date
Item.objects.filter(
account_id__in=account_ids
).order_by(
'account_id', '-created_date'
).distinct('account_id')