Pravděpodobně hledáte select_related
, což je přirozený způsob, jak toho dosáhnout:
pubs = publication.objects.select_related('country', 'country_state', 'city')
Výsledné SQL můžete zkontrolovat pomocí str(pubs.query)
, jehož výsledkem by měl být výstup v následujících řádcích (příklad je z backendu 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" )
Vrácené hodnoty kurzoru jsou poté převedeny do příslušných instancí modelu ORM, takže když tyto publikace projdete smyčkou, získáte přístup k hodnotám souvisejících tabulek prostřednictvím jejich vlastních objektů. Tyto přístupy v rámci předem vybraných dopředných vztahů však nezpůsobí další zásahy do databáze:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}