Você provavelmente está procurando por
select_related
, que é a maneira natural de conseguir isso:pubs = publication.objects.select_related('country', 'country_state', 'city')
Você pode verificar o SQL resultante via
str(pubs.query)
, que deve resultar na saída nas seguintes linhas (o exemplo é de um back-end 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" )
Os valores de cursor retornados são então traduzidos para as instâncias de modelo ORM apropriadas, de modo que, ao fazer um loop nessas publicações, você acesse os valores das tabelas relacionadas por meio de seus próprios objetos. No entanto, esses acessos ao longo das relações de encaminhamento pré-selecionadas não causarão acertos db extras:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}