Probablemente esté buscando select_related
, que es la forma natural de lograr esto:
pubs = publication.objects.select_related('country', 'country_state', 'city')
Puede verificar el SQL resultante a través de str(pubs.query)
, lo que debería dar como resultado una salida a lo largo de las siguientes líneas (el ejemplo es de un backend de postgres):
SELECT "publication"."id", "publication"."title", ..., "country"."country_name", ...
FROM "publication"
INNER JOIN "country" ON ( "publication"."country_id" = "country"."id" )
INNER JOIN "countrystate" ON ( "publication"."countrystate_id" = "countrystate"."id" )
INNER JOIN "city" ON ( "publication"."city_id" = "city"."id" )
Los valores de cursor devueltos luego se traducen a las instancias del modelo ORM apropiado, de modo que cuando recorre estas publicaciones, accede a los valores de las tablas relacionadas a través de sus propios objetos. Sin embargo, estos accesos a lo largo de las relaciones de reenvío preseleccionadas no generarán visitas adicionales a la base de datos:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}