Разве объект родительской модели "отношения один к одному" не имеет "_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
.