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

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

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

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

【问题讨论】:

    标签: django django-models django-orm


    【解决方案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',因为如果您不提及,则在您的数据库中递归地创建一个联合表

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-01
          • 2019-01-14
          相关资源
          最近更新 更多