Vous recherchez probablement select_related
, ce qui est le moyen naturel d'y parvenir :
pubs = publication.objects.select_related('country', 'country_state', 'city')
Vous pouvez vérifier le SQL résultant via str(pubs.query)
, qui devrait aboutir à une sortie dans les lignes suivantes (l'exemple provient d'un backend 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" )
Les valeurs de curseur renvoyées sont ensuite traduites dans les instances de modèle ORM appropriées, de sorte que lorsque vous effectuez une boucle sur ces publications, vous accédez aux valeurs des tables associées via leurs propres objets. Cependant, ces accès le long des relations directes présélectionnées ne causeront pas d'accès supplémentaires à la base de données :
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}