Когда django запрашивает базу данных при доступе к соответствующему экземпляру модели через отношения внешнего ключа? - PullRequest
0 голосов
/ 09 июля 2020

Это пример определения модели:

class Glass(model):
    type = models.CharField(max_length=255)

class Window(model):
    glass = models.ForeignKey(Glass)

class House(model)
    window = models.ForeignKey(Window)

Dotwalking внешних ключей упомянутых моделей и получение связанных объектов.

house = House.objects.get(pk=1)
window = house.window
glass= house.window.glass

Я понимаю, что для получения house запрос выполняется. Затем, когда я получаю house.window, я предполагаю, что выполняется второй запрос для получения экземпляра окна. И при доступе к glass Django уже загружен window в экземпляре House? Или он снова запрашивает окно?

Кажется, я не могу найти точный ответ на этот вопрос в Интернете или в Django документах.

Ответ был бы большим, чтобы углубить мое понимание Django Запрос ORM.

Ура!

1 Ответ

0 голосов
/ 09 июля 2020

каждый раз, когда вы запускаете orm, запрос выполняется, первая строка создает экземпляр house и для этого загружает его данными, то же самое верно для второй строки, но для экземпляра window и для третьего линия для экземпляра из стекла. Вы можете объединить эти запросы, добавив prefetch_related в качестве параметра в первый запрос. Если вам не нужен второй и / или третий запрос, вы можете получить доступ к полю id напрямую, используя house.window_id (обойдите orm, обратившись к атрибуту напрямую). Однако если вы используете house.window.id , вы вызовете orm для создания экземпляра окна.

...