Невозможно сократить запросы "SELECT" с "select_related()" и "prefetch_related()" в отношениях один-к-одному в Django
У меня есть Person
и PersonDetail
модели в отношениях один-к-одному как показано ниже. * Я использую Django 3.2.16:
class Person(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class PersonDetail(models.Model):
person = models.OneToOneField(Person, on_delete=models.CASCADE) # Here
age = models.IntegerField()
gender = models.CharField(max_length=20)
def __str__(self):
return str(self.age) + " " + self.gender
Затем, у меня есть 5 объектов для Person
и PersonDetail
моделей каждый:
Затем я выполняю итерацию и вызываю модель PersonDetail
из модели Person
, как показано ниже:
for obj in Person.objects.all():
print(obj.persondetail)
Или, я делаю итерацию и вызываю PersonDetail
модель из Person
модели с помощью select_related() как показано ниже:
for obj in Person.objects.select_related().all():
print(obj.persondetail)
Ор, я делаю итерацию и вызываю PersonDetail
модель из Person
модели с помощью prefetch_related() как показано ниже:
for obj in Person.objects.prefetch_related().all():
print(obj.persondetail)
Затем на консоль выводятся следующие данные:
32 Male
26 Female
18 Male
27 Female
57 Male
Затем выполняется 5 запросов SELECT
, как показано ниже для всех трех случаев приведенного выше кода. * Я использую PostgreSQL, и ниже показаны журналы запросов PostgreSQL, и вы можете посмотреть мой ответ , объясняющий, как включить и отключить журналы запросов на PostgreSQL:
Итак, я не могу сократить 5 запросов SELECT
с select_related()
и prefetch_related()
в отношениях один-к-одному в Django.
Итак, невозможно ли в Django свести SELECT
запросы с select_related()
и prefetch_related()
в отношения один-к-одному?
Вам нужно будет указать имя связанного поля, которое в данном случае равно persondetail
, поэтому:
for obj in Person.objects.select_related("persondetail").all():
print(obj.persondetail)