如何在 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 模型的字段

从没有外键的两个模型的 JOIN 中检索值(Django)

django:如何从包含外键的多个模型中制作一个表单

Django Rest API,如何为 2 个模型条目创建 post api,并具有与模型关联的外键

如何防止在 Django Admin 中对 FK / MTM 字段进行自我(递归)选择