Often one sees modeling with:
from django.db import models
class Profile(models.Model):
pass
class Post(models.Model):
author = models.ForeignKey(
Profile,
on_delete=models.CASCADE,
related_name='author'
)
Why is it a problem?
There is often some confusion about the related_name=…
parameter [Django-doc]. This parameters specifies the name of the relation in reverse. It is thus the name of the relation to access the related Post
objects for a given Profile
object. Indeed, with the modeling above, we access the Post
objects with:
# QuerySet of related Post objects
my_profile.author.all()
But here the relation does not hint that it deals with Post
s, one here would think we obtain a single Author
, or perhaps a set of Author
s, not Post
s.
What can be done to resolve the problem?
Give the related_name=…
a proper value. Sometimes adding the …_of
suffix is sufficient, like .author_of
, but still that is not self-explaining, since a Profile
can be an author of Post
s, Image
s, etc.
Usually it is better to use the plural of the model name, so posts
, or do not specify the related_name=…
, and thus use modelname_set
. It becomes more tricking if there are two or more relations to the same model, because then the default related_name=…
can not be used because it would collide.
Nevertheless, one should look how the source model relates to the target model, here these are the authored Post
s, so we can rewrite this to:
from django.db import models
class Profile(models.Model):
pass
class Post(models.Model):
author = models.ForeignKey(
Profile,
on_delete=models.CASCADE,
related_name='authored_posts'
)
Then we thus query with:
# QuerySet of related Post objects
my_profile.authored_posts.all()