related_name 1.6 后改变
related_name changed after 1.6
我要从 1.6 升级到 1.9。
我的项目包含源自此示例 AuditTrail 的代码:https://code.djangoproject.com/wiki/AuditTrail
本质上,此 AuditTrail 允许即时创建审计模型以记录对审计的任何更改 table。
部分代码需要确保避免related_name
之间的冲突。这是按如下方式完成的,从 1.6 开始工作正常。
if isinstance(field, models.ForeignKey):
rel = copy.copy(field.rel)
rel.related_name = '_audit_' + field.related_query_name()
attrs[field.name].remote_field = rel
出于某种原因,在升级后,django 在所有这些上都失败并出现 SystemCheckError,回溯看起来像:
SystemCheckError: System check identified some issues:
ERRORS:
email_reporting.ReportAudit.team: (fields.E304) Reverse accessor for 'ReportAudit.team' clashes with reverse accessor for 'Report.team'.
HINT: Add or change a related_name argument to the definition for 'ReportAudit.team' or 'Report.team'.
email_reporting.ReportAudit.team: (fields.E305) Reverse query name for 'ReportAudit.team' clashes with reverse query name for 'Report.team'.
HINT: Add or change a related_name argument to the definition for 'ReportAudit.team' or 'Report.team'.
有什么解决办法吗?我找不到任何可能是罪魁祸首的 related_name
更改。
只有当我使用 ./manage.py shell_plus
启动 django 时才会发生这种情况,但如果使用 ./manage.py shell
启动,一切似乎都能正常启动。
解决方案是直接修改rel
而不是remote_field
if isinstance(field, models.ForeignKey):
rel = copy.copy(field.rel)
if rel.related_name:
rel.related_name = '_audit_' + rel.related_name
elif rel:
rel.related_name = '_audit_' + rel.get_accessor_name()
attrs[field.name].rel.related_name=rel.related_name
我要从 1.6 升级到 1.9。 我的项目包含源自此示例 AuditTrail 的代码:https://code.djangoproject.com/wiki/AuditTrail
本质上,此 AuditTrail 允许即时创建审计模型以记录对审计的任何更改 table。
部分代码需要确保避免related_name
之间的冲突。这是按如下方式完成的,从 1.6 开始工作正常。
if isinstance(field, models.ForeignKey):
rel = copy.copy(field.rel)
rel.related_name = '_audit_' + field.related_query_name()
attrs[field.name].remote_field = rel
出于某种原因,在升级后,django 在所有这些上都失败并出现 SystemCheckError,回溯看起来像:
SystemCheckError: System check identified some issues:
ERRORS:
email_reporting.ReportAudit.team: (fields.E304) Reverse accessor for 'ReportAudit.team' clashes with reverse accessor for 'Report.team'.
HINT: Add or change a related_name argument to the definition for 'ReportAudit.team' or 'Report.team'.
email_reporting.ReportAudit.team: (fields.E305) Reverse query name for 'ReportAudit.team' clashes with reverse query name for 'Report.team'.
HINT: Add or change a related_name argument to the definition for 'ReportAudit.team' or 'Report.team'.
有什么解决办法吗?我找不到任何可能是罪魁祸首的 related_name
更改。
只有当我使用 ./manage.py shell_plus
启动 django 时才会发生这种情况,但如果使用 ./manage.py shell
启动,一切似乎都能正常启动。
解决方案是直接修改rel
而不是remote_field
if isinstance(field, models.ForeignKey):
rel = copy.copy(field.rel)
if rel.related_name:
rel.related_name = '_audit_' + rel.related_name
elif rel:
rel.related_name = '_audit_' + rel.get_accessor_name()
attrs[field.name].rel.related_name=rel.related_name