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')
Вернуться на верх