En django, ¿hay una manera de anotar directamente una consulta con un objeto relacionado en una sola consulta?

Considere esta consulta:

query = Novel.objects..annotate( latest_chapter_id=Max("volume__chapter__id") ) 

En realidad, lo que necesito es anotar cada Novel con su último objeto de Chapter , por lo que después de esta consulta tengo que ejecutar otra consulta para seleccionar objetos reales por ID anotados. En mi opinión, esto es feo. ¿Hay alguna manera de combinarlos en una sola consulta?

No, no es posible combinarlos en una sola consulta.

Puedes leer la siguiente publicación del blog para encontrar dos soluciones.

Si es posible.

Para obtener un queryset que contenga todos los capítulos que son los últimos en sus novelas, simplemente haga:

 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')) 

Probado en Django 1.7.