Django自引用外键


165

一般来说,我对Web应用程序和数据库内容还是陌生的,所以这可能是一个愚蠢的问题。我想制作一个模型(“ CategoryModel”),其字段指向模型的另一个实例(其父实例)的主要ID。

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

我该怎么做呢?谢谢!


2
从风格上讲,我建议使用parent代替parentId,因为my_category_model.parent它将是的实例CategoryModel。Django将自动创建一个成员parent_id,该成员将成为相关模型的主键。
10flow

Answers:


262

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

所以:

parent = models.ForeignKey("CategoryModel")

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

parent = models.ForeignKey("self")

55

您可以使用字符串“ self”表示自我参考。

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

https://docs.djangoproject.com/zh-CN/dev/ref/models/fields/#foreignkey


7
我认为您的意思是“自我”。如在字符串中。在这种情况下,自我是不确定的
Jared Forsyth

1
@Brandon您的答案中的“自我”与贾里德在评论中所说的有什么不同?“我认为你是说'自我'!” 。两者都是字符串,根据django docs很好。!任何提示
斯瑞克

1
区别在于self定义模型属性时不存在。如果将该属性定义为__init__()或另一方法的一部分,则它将self始终是Python类的任何实例方法的第一个位置参数。
布兰登


1

您还要设置null = True和blank = True

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

null = True,允许在数据库中
blank = True,允许在表单中验证

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.