Делают ли запросы к модели 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