Вероятно търсите 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 модел, така че когато прелиствате тези публикации, имате достъп до стойностите на свързаните таблици чрез техните собствени обекти. Въпреки това, тези достъпи по предварително избраните връзки напред няма да причинят допълнителни посещения в db:
{% for p in pubs %}
{{ p.city.city_name}} # p.city has been populated in the initial query
# ...
{% endfor %}