Делают ли запросы к модели Django автоматически запросы к объектам ссылок на внешний ключ?

Рассмотрим следующую модель Django:

class Name(models.Model):
    pkid      = models.BigAutoField(primary_key=True)

    person    = models.ForeignKey(to=Person,
                                  on_delete=models.CASCADE)

    full_name = models.CharField(max_length=100)

Будет ли следующий запрос автоматически выполнять объединение и извлекать связанный объект Person?

results = models.Name.objects.all()

Или все поля ссылок на внешний ключ в Django автоматически откладываются до момента обращения к ним?

print(results[0].person)

Django по умолчанию не запрашивает иностранные модели при получении экземпляра, однако это можно настроить с помощью метода select_related. Вместо этого иностранные экземпляры запрашиваются при обращении к ним (например, при оценке results[0].person).

Если вы хотите изучить, как Django запрашивает базу данных, вы можете просмотреть django.db.connection.queries (как объясняется в Как увидеть необработанные SQL-запросы, которые выполняет Django?).

Например:

Первый импорт:

from django.db import connection
print("queries: ", len(connection.queries)) # 0
results = models.Name.objects.all()
print("queries: ", len(connection.queries)) # 1
print(results[0].person)
print("queries: ", len(connection.queries)) # 2

С select_related:

print("queries: ", len(connection.queries)) # 0
results = models.Name.objects.select_related("person").all()
print("queries: ", len(connection.queries)) # 1
print(results[0].person)
print("queries: ", len(connection.queries)) # 1
Вернуться на верх