おそらく select_related
>
、これを達成するための自然な方法です:
pubs = publication.objects.select_related('country', 'country_state', 'city')
結果のSQLは、 str(pubs.query)
で確認できます。 、次の行に沿って出力されるはずです(例は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" )
返されたカーソル値は、適切なORMモデルインスタンスに変換されるため、これらのパブリケーションをループすると、関連するテーブルの値に独自のオブジェクトを介してアクセスできます。ただし、事前に選択された転送関係に沿ったこれらのアクセスによって、余分なデータベースヒットが発生することはありません。
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}