Django出现错误:模型中的“反向访问器”

时间:2019-12-12 14:35:11

标签: django django-models

我正在尝试使用django inspect db创建数据库模型,它正在生成所有模型,但出现错误。

我正在使用以下命令为现有数据库生成数据库模型:

python manage.py inspectdb > models.py

它正在准确地生成模型,但是在这样的文件中:

create_uid = models.ForeignKey('self', models.DO_NOTHING,db_column='create_uid', blank=True, null=True)
write_uid = models.ForeignKey('self',models.DO_NOTHING,  db_column='write_uid', blank=True, null=True)

我遇到错误:

polls.ResUsers.create_uid: (fields.E304) Reverse accessor for 'ResUsers.create_uid' clashes with reverse accessor for 'ResUsers.write_uid'.
    HINT: Add or change a related_name argument to the definition for 'ResUsers.create_uid' or 'ResUsers.write_uid'.
polls.ResUsers.write_uid: (fields.E304) Reverse accessor for 'ResUsers.write_uid' clashes with reverse accessor for 'ResUsers.create_uid'.
    HINT: Add or change a related_name argument to the definition for 'ResUsers.write_uid' or 'ResUsers.create_uid'.

我正在添加相关名称,如下所示:

create_uid = models.ForeignKey('self', models.DO_NOTHING,related_name='create_uid',db_column='create_uid', blank=True, null=True)

我应该怎么做才能使用生成的模型。我正在使用postgres。

我正在更新我的问题,当我像这样使用它时,答案之一对我有用:

create_uid = models.ForeignKey(
    'self',
    models.DO_NOTHING,
    db_column='create_uid',
    related_name='created_items',
    blank=True,
    null=True
)

在另一个使用此类代码的模型类中:

create_uid = models.ForeignKey(
    'ResUsers',
    models.DO_NOTHING,
    db_column='create_uid',
    related_name='created_items',
    blank=True,
    null=True
)

我遇到了错误:

polls.ResUsers.create_uid: (fields.E304) Reverse accessor for 'ResUsers.create_uid' clashes with reverse accessor for 'SurveyUserInput.create_uid'.
    HINT: Add or change a related_name argument to the definition for 'ResUsers.create_uid' or 'SurveyUserInput.create_uid'.

1 个答案:

答案 0 :(得分:2)

related_name=… [Django-doc]是相反关系的名称。因此,这意味着使用a for a in dir(Son) if not a.startswith('__')] / create_uid对象访问所有模型对象。这可能导致write_uid为零,一个或多个元素。

因此,同一模型的两个QuerySet中的related_name可以相同,因为那样会使模型变得模棱两可。由于您的ForeignKey引用的是ForeignKey模型,因此您甚至无法为它们指定已经存在的字段的名称。

因此,您可能想给关系起一个类似的名字:

'self'