在 Django 中,如何让模型引用自身?

Posted

技术标签:

【中文标题】在 Django 中,如何让模型引用自身?【英文标题】:In Django, how do you make a model refer to itself? 【发布时间】:2011-06-22 02:33:43 【问题描述】:

假设我们有类Employee。我想要一个引用同一类的不同实例的字段。

这个怎么写?下面的代码呢?

ref_employee= models.ForeignKey('self',null=True,blank=True)

【问题讨论】:

【参考方案1】:

您可以通过名称引用其他模型(使用字符串,包括 包),而不是直接由类:

所以,如果您的 Employee 课程在 hr 应用程序中:

class Employee(models.model):
   other_employee = models.ForeignKey('hr.models.Employee', null=True, blank=True)

【讨论】:

我发现引用需要省略模型引用的“模型”部分(即models.ForeignKey('hr.Employee', null=True, blank=True)【参考方案2】:

http://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

创建递归关系—— 具有多对一的对象 与自身的关系——使用 models.ForeignKey('self').

所以你说得对。通过运行它来确定代码是否会执行您想要的操作通常会更快:)

【讨论】:

感谢您的回答。此外,仅仅因为某些东西看起来有效并不意味着这样做是个好主意。最好找出正确的方法,从别人的经验和错误中学习。 @dsjoerg,完全同意 ;) 只是一个解释。从 Django 2.0 开始,您需要将“on_delete”属性传递给 ForeignKey 类。如果不这样做,您将遇到该错误:“TypeError:__init__() 缺少 1 个必需的位置参数:'on_delete'”。查看docs.djangoproject.com/en/2.0/ref/models/fields/… 以了解在您的情况下必须如何使用选项。【参考方案3】:

强制idref_employee_id 具有不同值的约束超出了Django ORM 的范围。您需要在数据库级别通过 SQL 或手动添加所述约束。

【讨论】:

【参考方案4】:

我相信您甚至可以排除看起来像这样的应用名称:

ref_employee= models.ForeignKey('Employee',null=True,blank=True)

【讨论】:

【参考方案5】:

是的,这是正确的,但请考虑您应该写 'null=True',因为如果您不提及,则在您的数据库中递归地创建一个联合表

【讨论】:

以上是关于在 Django 中,如何让模型引用自身?的主要内容,如果未能解决你的问题,请参考以下文章

55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解

如何在 django 的自引用模型中优化相关记录的检索?

响应 Django 中的模型更改?

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

Python GraphQL 如何声明一个自引用的石墨烯对象类型

Django模型:如何避免在使用来自同一个表的2个外键时引用相同的记录