在 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】:强制id
和ref_employee_id
具有不同值的约束超出了Django ORM 的范围。您需要在数据库级别通过 SQL 或手动添加所述约束。
【讨论】:
【参考方案4】:我相信您甚至可以排除看起来像这样的应用名称:
ref_employee= models.ForeignKey('Employee',null=True,blank=True)
【讨论】:
【参考方案5】:是的,这是正确的,但请考虑您应该写 'null=True'
,因为如果您不提及,则在您的数据库中递归地创建一个联合表
【讨论】:
以上是关于在 Django 中,如何让模型引用自身?的主要内容,如果未能解决你的问题,请参考以下文章
55.ORM外键:引用同app下的不同模型,引用不同app下的模型,引用模型自身使用详解