In this tutorial, I’m explaining the OneToOneField relationship in the Django model and how to access these model fields in the Django template using related_name
.
Django supports both OneToOneField
and ForeignKey
fields. Both are different concepts. For the foreign key, follow this tutorial.
Let’s get into the practical example where we are setting up the OneToOneField
relationship in Django model.
Suppose you have this model called Author
.
class Author(models.Model): author_name = models.CharField(max_length=120)
Now, you want to create another model which will have a one-to-one relation with the model ‘Author’, says ‘Contact’.
Use the ‘OneToOneField
‘ model attribute as below.
class Contact(models.Model): author = models.OneToOneField(User, on_delete=models.CASCADE, related_name="author_contact") address = models.CharField(max_length=120) mobile = models.IntegerField(blank=True, null=True)
Look at the above code, we are using related_name
. This can be considered as one of the Django related name examples.
Note: If you are making any changes to the models.py
, make sure you do the complete migrations.
Now we are reading all the contacts and also reading the name of the author for each contact.
Get all the objects of the model ‘Contact’ in your views.py
file.
contact = Contact.objects.filter()
And pass this to the template.
Now, go to your HTML template and add this code.
{% conatct for contacts %} {{conatct.author.author_name}} {{conatct.address}} {{conatct.mobile}} {% endfor %}
This will show the list of all the contacts including the author’s name.
It’s simple. Isn’t it?
Now, what if you want to get the user contact details for each user?
Python also supports backward compatibility. It is also called reverse compatibility.
Get all the objects of the model ‘Author’ in your views.py
file.
authors = Author.objects.filter()
Here are using a related_name
‘author_contact’ that we set in the ‘Contact’ Django model.
{% auth for authors %} {{auth.author_name}} {{auth.author_contact.address}} {{auth.author_contact.mobile}} {% endfor %}
Look, guys. I tried to keep this tutorial easy to refer. Hope you find it useful. If you have any questions, let me know in the comment below. Thanks!