Doesn't the parent model's object of "one to one relationship" have "_set" in Django?
I have Person
and PersonDetail
models below which have one-to-one relationship:
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)
But, when using persondetail_set
of a Person
object as shown below:
obj = Person.objects.all()[0]
print(obj.persondetail_set.all())
# ↑ ↑ Here ↑ ↑
There is the error below:
AttributeError: 'Person' object has no attribute 'persondetail_set'
So, I changed one-to-one relationship to one-to-many relationship as shown below:
class PersonDetail(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
# ...
Then, there was no error:
<QuerySet [<PersonDetail: 32 Male>]>
Or, I changed one-to-one relationship to many-to-many relationship as shown below:
class PersonDetail(models.Model):
person = models.ManyToManyField(Person)
# ...
Then, there was no error:
<QuerySet [<PersonDetail: 32 Male>]>
So, doesn't the parent model's object of one-to-one relationship have _set
in Django?
obj = Person.objects.all()[0]
print(obj.persondetail_set.all())
# ↑ ↑ Here ↑ ↑
So, doesn't the parent model's object of one-to-one relationship have _set in Django?
Why would have it, when OneToOne
has got max 1 related object? _set
is created only for relation that can be with many objects, like ManyToMany
or OneToMany
(ForeignKey
).
By default (if you have no related_name
set) for OneToOne
instead of persondetail_set.get(id=1)
, persondetail_set.filter(id=1)
and persondetail_set.all()
use just persondetail
.