如何在 Django 中对同一个模型有两个外键?
Posted
技术标签:
【中文标题】如何在 Django 中对同一个模型有两个外键?【英文标题】:How can I have two foreign keys to the same model in Django? 【发布时间】:2010-10-07 07:13:51 【问题描述】:我想对同一个模型有两个外键:
class Test(models.model):
example1 = models.ForeignKey(Example)
example2 = models.ForeignKey(Example)
我收到如下错误:
字段“example1”的访问器与相关的冲突 字段'Example.test_set'。添加一个 related_name 参数 'example1'的定义。
【问题讨论】:
【参考方案1】:尝试使用related_name
:
class Test(models.model):
example1 = models.ForeignKey('Example', related_name='example1')
example2 = models.ForeignKey('Example', related_name='example2')
【讨论】:
我在应用中有两个模型试图做到这一点。第二个适用于这种方法:它必须为第一个模型提供外键。第一个模型不起作用。也许是因为它指的是导入的模型。有没有人用进口模型做这个工作?Example
model 需要这些单引号吗?【参考方案2】:
Django 使用一些 python 魔法来定义模型之间的关系,其中一些涉及使用关系中模型的名称(这就是 'test__set' 中的 'test' 的来源。)我猜发生了什么,是它试图将“test__set”两次放入示例模型中,一次用于您定义的每个外键。
错误消息建议尝试:定义一个related_name
参数(覆盖其中一个'test_set'),它可以使用它而不是自动生成两个冲突的名称。
更多信息here:页面已被删除
与模型关系相关的当前页面: https://docs.djangoproject.com/en/2.0/ref/models/fields/#module-django.db.models.fields.related
【讨论】:
另见Following relationships “backward”【参考方案3】:按照错误消息告诉您的操作去做,如果您不确定这意味着什么,请查阅related_name
的文档。
【讨论】:
【参考方案4】:在 django 2.0 中试试这个:
user = models.ForeignKey(User, on_delete=models.PROTECT, null=True, related_name='user')
paper = models.ForeignKey(paperRecord, on_delete=models.PROTECT, null=True, related_name='paper')
【讨论】:
以上是关于如何在 Django 中对同一个模型有两个外键?的主要内容,如果未能解决你的问题,请参考以下文章
Django模型:如何避免在使用来自同一个表的2个外键时引用相同的记录
如何根据具有外键关系的另一个模型更新 Django 模型的字段