Du letar förmodligen efter select_related
, vilket är det naturliga sättet att uppnå detta:
pubs = publication.objects.select_related('country', 'country_state', 'city')
Du kan kontrollera den resulterande SQL-koden via str(pubs.query)
, vilket bör resultera i utdata längs följande rader (exemplet är från en postgres backend):
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" )
De returnerade markörvärdena översätts sedan till lämpliga ORM-modellinstanser, så att när du loopar över dessa publikationer får du tillgång till de relaterade tabellernas värden via deras egna objekt. Dessa åtkomster längs de förvalda framåtriktade relationerna kommer dock inte att orsaka extra db-träffar:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}