(Это - django версия потока в соединении SQL: выбор последних записей в связи "один ко многим")
Предположим, что у меня есть таблица клиентов и таблица покупок. Каждая покупка принадлежит одному клиенту. Я хочу получить список всех клиентов наряду с их последней покупкой. Это может быть сделано без необработанного SQL и без нескольких запросов базы данных?
Вы можете взглянуть на подобное обсуждение:
Django Query, который получает самые последние объекты из разных категорий
SELECT *
FROM customers с
LEFT JOIN
purchases p
ON p.id =
(
SELECT id
FROM purchases pl
WHERE pl.customer = c.id
ORDER BY
pl.customer DESC, pl.date DESC
LIMIT 1
)
Убедитесь, что у вас есть композитный индекс на покупках (клиент, дата)
Если ваша таблица InnoDB
, или на покупок (клиент, дата, ID)
Если ваш стол MyISAM
.
Вы не можете сделать это в одном запросе в Django. Вы можете получить клиента, указав только дату его последней покупки, например:
from django.db.models import Max
customers = Customer.objects.annotate(Max('purchase__date'))
, но вы не получите автоматически доступ к фактической покупке таким образом.