在Django中,如何使一个模型引用自身?

49

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

如何编写这个任务?下面的代码是否可行?

ref_employee= models.ForeignKey('self',null=True,blank=True)
5个回答

92

13
谢谢您的回答。但是,仅仅因为某事似乎有效,并不意味着这样做是一个好主意。最好找到正确的方法,并从他人的经验和错误中学习。 - dsjoerg
@dsjoerg,完全同意 ;) - Programadores Brasil
1
只是一个解释。自Django 2.0以来,您需要将“on_delete”属性传递给ForeignKey类。如果不这样做,您将会遇到这个错误:“TypeError:__init __()缺少1个必需的位置参数:'on_delete'”。请查看https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete了解您在此情况下必须使用的选项。 - Programadores Brasil

5

我相信你甚至可以排除应用程序名称,看起来像:

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

4

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

因此,如果您的Employee类位于hr应用程序中:

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

2
我发现引用需要省略模型引用的“models”部分(即models.ForeignKey('hr.Employee', null=True, blank=True))。 - CoatedMoose

3

是的,这是正确的,但请考虑编写'null=True',因为如果您不提及它,您的数据库将递归创建联合表。


2
你的数据库递归地创建了一个联合表是什么意思? - Tariq Ahmed

0

强制要求idref_employee_id具有不同的值的限制超出了Django ORM的范围。 您需要通过在syncdb中使用SQL或手动方式在数据库级别上添加该约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接