Разве объект родительской модели "отношения один к одному" не имеет "_set" в Django?

Ниже приведены модели Person и PersonDetail, которые имеют отношения один к одному:

class Person(models.Model):
    name = models.CharField(max_length=20)

class PersonDetail(models.Model):
    person = models.OneToOneField(Person, on_delete=models.CASCADE)
    age = models.IntegerField()
    gender = models.CharField(max_length=20)

Но при использовании persondetail_set объекта Person, как показано ниже:

obj = Person.objects.all()[0]
print(obj.persondetail_set.all())
          # ↑ ↑ Here ↑ ↑

Ниже приведена ошибка:

AttributeError: объект 'Person' не имеет атрибута 'persondetail_set'

Итак, я изменил отношения один-к-одному на отношения один-ко-многим, как показано ниже:

class PersonDetail(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    # ...

Тогда ошибки не было:

<QuerySet [<PersonDetail: 32 Male>]>

Ор, я изменил отношения "один к одному" на отношения "многие ко многим" , как показано ниже:

class PersonDetail(models.Model):
    person = models.ManyToManyField(Person)
    # ...

Тогда ошибки не было:

<QuerySet [<PersonDetail: 32 Male>]>

Так, разве объект родительской модели отношения один-к-одному не имеет _set в Django?

obj = Person.objects.all()[0]
print(obj.persondetail_set.all())
          # ↑ ↑ Here ↑ ↑

Итак, разве объект родительской модели отношения один-к-одному не имеет _set в Django?

Зачем это нужно, если OneToOne имеет максимум 1 связанный объект? _set создается только для связи, которая может быть со многими объектами, как ManyToMany или OneToMany (ForeignKey).

По умолчанию (если у вас не установлен related_name) для OneToOne вместо persondetail_set.get(id=1), persondetail_set.filter(id=1) и persondetail_set.all() используйте только persondetail.

Вернуться на верх