Ответ 1
Нет, невозможно объединить их в один запрос.
Вы можете прочитать следующее сообщение в блоге, чтобы найти два обхода.
Рассмотрим этот запрос:
query = Novel.objects.< ...some filtering... >.annotate(
latest_chapter_id=Max("volume__chapter__id")
)
Фактически мне нужно аннотировать каждый Novel
своим последним объектом Chapter
, поэтому после этого запроса мне нужно выполнить другой запрос, чтобы выбрать фактические объекты по аннотированным идентификаторам. ИМО это некрасиво. Есть ли способ объединить их в один запрос?
Нет, невозможно объединить их в один запрос.
Вы можете прочитать следующее сообщение в блоге, чтобы найти два обхода.
Да, это возможно.
Чтобы получить набор запросов, содержащий все главы, которые являются последними в их романах, просто выполните:
from django.db.models.expressions import F
from django.db.models.aggregates import Max
Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk')
).filter(pk=F('last_chapter_pk'))
Проверено на Django 1.7.