【问题标题】:Django self-referential foreign keyDjango自引用外键
【发布时间】:2013-02-23 12:05:00
【问题描述】:

一般来说,我对 webapps 和数据库的东西有点陌生,所以这可能是一个愚蠢的问题。我想创建一个模型(“CategoryModel”),其字段指向模型的另一个实例(其父级)的主 ID。

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

我该怎么做?谢谢!

【问题讨论】:

  • 从风格上讲,我建议将其称为parent 而不是parentId,因为my_category_model.parent 将是CategoryModel 的一个实例。 Django 会自动创建一个成员parent_id,作为相关模型的主键。

标签: python django django-orm


【解决方案1】:

您可以将模型名称作为字符串传递给 ForeignKey,它会做正确的事情。

所以:

parent = models.ForeignKey("CategoryModel")

或者你可以使用字符串“self”

parent = models.ForeignKey("self")

【讨论】:

  • 如果不设置 null=True / blank = True 怎么处理根实例?
  • @zypro 你不能。你必须让它可以为空。
  • parent = models.ForeignKey("self") 更具可读性
【解决方案2】:

您可以使用字符串“self”来表示自引用。

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

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

【讨论】:

  • 我认为您的意思是“自我”。就像在字符串中一样。在这种情况下,self 是未定义的
  • @Brandon 您的回答中的“自我”与 jared 在评论中所说的有何不同? “我认为你的意思是‘自我’!!!! .根据 django 文档,两者都是字符串。 !任何提示
  • 区别在于self在定义模型属性时不存在。如果该属性被定义为 __init__() 或其他方法的一部分,则它会是,因为 self 始终是 Python 类的任何实例方法的第一个位置参数。
【解决方案3】:

https://books.agiliq.com/projects/django-orm-cookbook/en/latest/self_fk.html

class Employee(models.Model):
    manager = models.ForeignKey('self', on_delete=models.CASCADE)

class Employee(models.Model):
    manager = models.ForeignKey("app.Employee", on_delete=models.CASCADE)

https://stackabuse.com/recursive-model-relationships-in-django/

【讨论】:

    【解决方案4】:

    你也可以设置null=Trueblank=True

    class CategoryModel(models.Model):
        parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)
    

    null=True,允许进入数据库
    blank=True,允许进入表单验证

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      相关资源
      最近更新 更多