Prawdopodobnie szukasz select_related
, co jest naturalnym sposobem na osiągnięcie tego:
pubs = publication.objects.select_related('country', 'country_state', 'city')
Możesz sprawdzić wynikowy SQL poprzez str(pubs.query)
, co powinno skutkować w następującym wierszu (przykład pochodzi z zaplecza 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" )
Zwrócone wartości kursora są następnie tłumaczone na odpowiednie wystąpienia modelu ORM, dzięki czemu po przejściu przez te publikacje można uzyskać dostęp do wartości powiązanych tabel za pośrednictwem ich własnych obiektów. Jednak te dostępy wzdłuż wcześniej wybranych relacji do przodu nie spowodują dodatkowych trafień w db:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}