Невозможно сократить запросы "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 моделей каждый:

enter image description here

enter image description here

Затем я выполняю итерацию и вызываю модель 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:

enter image description here

Итак, я не могу сократить 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)
Вернуться на верх