В django существует ли способ напрямую аннотировать запрос связанным объектом в одном запросе?

Рассмотрим этот запрос:

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id")
)

Фактически мне нужно аннотировать каждый Novel своим последним объектом Chapter, поэтому после этого запроса мне нужно выполнить другой запрос, чтобы выбрать фактические объекты по аннотированным идентификаторам. ИМО это некрасиво. Есть ли способ объединить их в один запрос?

Ответ 1

Нет, невозможно объединить их в один запрос.

Вы можете прочитать следующее сообщение в блоге, чтобы найти два обхода.

Ответ 2

Да, это возможно.

Чтобы получить набор запросов, содержащий все главы, которые являются последними в их романах, просто выполните:

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.