【问题标题】:fields.E305 reverse query name clashes with reverse query namefields.E305 反向查询名称与反向查询名称冲突
【发布时间】:2021-07-01 12:34:15
【问题描述】:

我想在每个模型中都有审计列。但是,一旦两个模型具有相同的代码,我就会收到错误“(fields.E305) 'app.Model.created_on' 的反向查询名称与 'app.Model.created_on' 的反向查询名称冲突。

  • created_on
  • created_by
  • updated_on
  • updated_by

例子


class ModelB(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='created_by', 
    on_delete=models.CASCADE)
    updated_on = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='updated_by', on_delete=models.CASCADE)

class ModelB(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='created_by', 
    on_delete=models.CASCADE)
    updated_on = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='updated_by', on_delete=models.CASCADE)


我真的不需要每个用户的反向键,但我想要一种能够在必要时查找 user_id 的方法。

【问题讨论】:

  • 你为什么要做两个class ModelBs?这似乎没有多大意义。
  • 这更像是一个例子。假设我希望对任何模型进行的所有数据库更改都进行审计,我将为每个模型创建一个 created_on、created_by、updated_on 和 updated_by 字段。我还了解到,我可以简单地添加 related_name='+' 来防止创建反向。

标签: django django-models


【解决方案1】:

我能够通过以下方式解决此问题。

created_on = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='created_by_%(class)s_related', on_delete=models.CASCADE)
updated_on = models.DateTimeField(auto_now=True)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='updated_by_%(class)s_related', on_delete=models.CASCADE)

参考Multiple foreign key fields in abstract Django class

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 2021-12-06
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2014-05-21
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多