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