Django error message "Add a related_name argument to the definition"

Django

Django Problem Overview


D:\zjm_code\basic_project>python manage.py syncdb
Error: One or more models did not validate:
topics.topic: Accessor for field 'content_type' clashes with related field 'Cont
entType.topic_set'. Add a related_name argument to the definition for 'content_t
ype'.
topics.topic: Accessor for field 'creator' clashes with related field 'User.crea
ted_topics'. Add a related_name argument to the definition for 'creator'.
topics.topic: Reverse query name for field 'creator' clashes with related field
'User.created_topics'. Add a related_name argument to the definition for 'creato
r'.
topicsMap.topic: Accessor for field 'content_type' clashes with related field 'C
ontentType.topic_set'. Add a related_name argument to the definition for 'conten
t_type'.
topicsMap.topic: Accessor for field 'creator' clashes with related field 'User.c
reated_topics'. Add a related_name argument to the definition for 'creator'.
topicsMap.topic: Reverse query name for field 'creator' clashes with related fie
ld 'User.created_topics'. Add a related_name argument to the definition for 'cre
ator'.

Django Solutions


Solution 1 - Django

You have a number of foreign keys which django is unable to generate unique names for.

You can help out by adding "related_name" arguments to the foreignkey field definitions in your models. Eg:

content_type = ForeignKey(Topic, related_name='topic_content_type')

See here for more. http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

Solution 2 - Django

Example:

class Article(models.Model):
    author = models.ForeignKey('accounts.User')
    editor = models.ForeignKey('accounts.User')
    

This will cause the error, because Django tries to automatically create a backwards relation for instances of accounts.User for each foreign key relation to user like user.article_set. This default method is ambiguous. Would user.article_set.all() refer to the user's articles related by the author field, or by the editor field?

Solution:

class Article(models.Model):
    author = models.ForeignKey('accounts.User', related_name='author_article_set')
    editor = models.ForeignKey('accounts.User', related_name='editor_article_set')

Now, for an instance of user user, there are two different manager methods:

  1. user.author_article_setuser.author_article_set.all() will return a Queryset of all Article objects that have author == user

  2. user.editor_article_setuser.editor_article_set.all() will return a Queryset of all Article objects that have editor == user


Note: This is an old example — on_delete is now another required argument to models.ForeignKey. Details at https://stackoverflow.com/questions/38388423/what-does-on-delete-do-on-django-models

Solution 3 - Django

"If a model has a ForeignKey, instances of the foreign-key model will have access to a Manager that returns all instances of the first model. By default, this Manager is named FOO_set, where FOO is the source model name, lowercased."

But if you have more than one foreign key in a model, django is unable to generate unique names for foreign-key manager.
You can help out by adding "related_name" arguments to the foreignkey field definitions in your models.

See here: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

Solution 4 - Django

I had a similar problem when I was trying to code a solution for a table that would pull names of football teams from the same table. My table looked like this:

hometeamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE)
awayteamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE)

making the below changes solved my issue:

hometeamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE,related_name='home_team')
awayteamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE,related_name='away_team')

Solution 5 - Django

If your models are inheriting from the same parent model, you should set a unique related_name in the parent's ForeignKey. For example:

author = models.ForeignKey('accounts.User', related_name='%(app_label)s_%(class)s_related')

It's better explained in th

Solution 6 - Django

But in my case i am create a separate app for some functionality with same model name and field ( copy/paste ;) ) that's because of this type of error occurs i am just deleted the old model and code will work fine
May be help full for beginners like me :)

Solution 7 - Django

If your models are inheriting from the same parent model, you should set a unique related_name in the parent's ForeignKey. For example:

author = models.ForeignKey('accounts.User', related_name='%(app_label)s_%(class)s_related')

It's better explained in the docs

Solution 8 - Django

This isn't an ultimate answer for the question, however for someone it may solve the problem. I got the same error in my project after checking out a really old commit (going to detached head state) and then getting the code base back up to date. Solution was to delete all *.pyc files in the project.

Solution 9 - Django

Do as the error message instructs you to:

> Add a related_name argument to the > definition for 'creator'.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionzjm1126View Question on Stackoverflow
Solution 1 - DjangoJohn MeeView Answer on Stackoverflow
Solution 2 - DjangoMark ChackerianView Answer on Stackoverflow
Solution 3 - DjangohufeiView Answer on Stackoverflow
Solution 4 - DjangobitFezView Answer on Stackoverflow
Solution 5 - DjangoSomiya JainView Answer on Stackoverflow
Solution 6 - DjangoGrvTyagiView Answer on Stackoverflow
Solution 7 - DjangoMaximiliano CruzView Answer on Stackoverflow
Solution 8 - Django3GeeView Answer on Stackoverflow
Solution 9 - DjangolprsdView Answer on Stackoverflow