【问题标题】:related_name changed after 1.6related_name 在 1.6 之后更改
【发布时间】:2017-01-10 22:39:49
【问题描述】:

我正在从 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 启动,事情似乎可以正常启动。

【问题讨论】:

  • 设置related_name = '+' 似乎可以修复它,但显然它会失去功能。

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


【解决方案1】:

解决办法是直接修改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

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2018-11-24
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2023-04-03
    • 2020-05-29
    相关资源
    最近更新 更多