related_name in Django is an attribute that is used to specify the name of the Manager that returns the instances of the source model in the model’s relationship i.e the name to use for the reverse filter from the target model (backward relation).

backward relation

If you don’t specify the related_name for the backward relation, by default, Django will use the name of the source model with the suffix _set as the related_name.

For example, in the following code snippet, the ForeignKeyField does not have related_name attribute:

class Blog(models.Model):
    name = models.CharField(max_length=20)

class Post(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)

So to filter the Post (source model) from the instance of the Blog (target model), you will have to use the post_set as the filter name.

>>> b = Blog.objects.get(id=1)
>>> b.post_set.all() # Returns all Post objects related to Blog

You can override the post_set by setting the related_name parameter in the ForeignKey definition.


class Post(models.Model):
    blog = models.ForeignKey(Blog, related_name='posts', on_delete=models.CASCADE)

Now you can filter Post from the instance of Blog like this:

>>> b = Blog.objects.get(id=1)
>>> b.posts.all() # Returns all Post objects related to Blog

Where can you use ‘related_name’ attribute?

You can use related_name attribute (for naming the backward relation) in the relationship fields. These are those fields that refer to other models or represent relationships. For example, ForeignKey, OneToOneField, and ManyToManyField.

Adarsh Kumar

I am an engineer by education and writer by passion. I started this blog to share my little programming wisdom with other programmers out there. Hope it helps you.

This Post Has 2 Comments

  1. GreenAsJade


    1. Adarsh Kumar

      Thanks, Green, for pointing out. I have updated the post.

Leave a Reply