Чтобы отобразить данные из нескольких связанных таблиц в Django, часто необходимо внутреннее соединение. В этой статье мы рассмотрим, как выполнить внутреннее соединение с помощью ORM (объектно-реляционного картографа) Django.
Отношения моделей
Models.py в предоставленный код определяет следующие связи между таблицами:
Внутреннее соединение с использованием select_related
Для достижения эффекта внутреннего соединения можно использовать метод Django select_related. Он предварительно выбирает связанные объекты вместе с основными объектами, сокращая количество запросов к базе данных, необходимых для доступа к связанным данным.
В view.py для выполнения внутреннего соединения можно использовать следующий код:
pubs = publication.objects.select_related('country', 'country_state', 'city')
Проверка сгенерированного SQL
Используя str(pubs.query), можно проверить сгенерированный SQL-запрос. Он будет напоминать предоставленный SQL-запрос с внутренними соединениями между таблицами:
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" )
Доступ к связанным данным
После внутреннего соединения Доступ к связанным данным можно получить через соответствующие атрибуты объекта модели. Например, чтобы отображать название города для каждой публикации:
{% for p in pubs %} {{ p.city.city_name}} # p.city has been populated in the initial query # ... {% endfor %}
Благодаря использованию select_related в Django можно эффективно реализовать внутренние соединения для извлечения данных из связанных таблиц, сокращая количество запросов к базе данных и повышая производительность.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3