0

I have Person model and PersonDetail model with OneToOneField() as shown below:

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.get(id=1)
print(obj.persondetail_set.get(id=1))
        # ↑ ↑ ↑ Here ↑ ↑ ↑

Then, there is the error below:

AttributeError: 'Person' object has no attribute 'persondetail_set'

So, I used ForeignKey() as shown below:

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

Then, there was no error:

PersonDetail object (1)

Or, I used ManyToManyField() as shown below:

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

Then, there was no error:

PersonDetail object (1)

So, cannot the parent model's object use _set with OneToOneField() in Django?

obj = Person.objects.get(id=1)
print(obj.persondetail_set.get(id=1))
        # ↑ ↑ ↑ Here ↑ ↑ ↑
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129
  • No, because in a 1-to-1 relation, having `_set` as the name of the relation doesn't make sense(because we know there will be almost one related object). Hence, Django allows us to access it directly, but since you don't have `related_name` defined it uses a lowercase version of your model: `person_obj.persondetail`. – Ashwini Chaudhary Jan 28 '23 at 07:20

1 Answers1

1

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.all() use just persondetail.

NixonSparrow
  • 6,130
  • 1
  • 6
  • 18