1.6

时间:2017-01-10 22:39:50

标签: django django-models django-1.9 django-1.6

我从1.6升级到1.9。 我的项目包括从此示例AuditTrail派生的代码:https://code.djangoproject.com/wiki/AuditTrail

基本上,此AuditTrail允许即时创建审计模型,以记录对审计表的任何更改。

部分代码需要确保避免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启动,事情似乎正常启动。

1 个答案:

答案 0 :(得分:0)

解决方案是直接修改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