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.

Back to Top