Django error message “Add a related_name argument to the definition”

前端 未结 8 1446
伪装坚强ぢ
伪装坚强ぢ 2020-12-01 00:53
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 rel         


        
相关标签:
8条回答
  • 2020-12-01 01:02

    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.

    0 讨论(0)
  • 2020-12-01 01:08

    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')
    
    0 讨论(0)
  • 2020-12-01 01:11

    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.

    0 讨论(0)
  • 2020-12-01 01:15

    "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

    0 讨论(0)
  • 2020-12-01 01:15

    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 :)

    0 讨论(0)
  • 2020-12-01 01:25

    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

    0 讨论(0)
提交回复
热议问题