Django自引用外键

228

我对Web应用程序和数据库等内容比较陌生,所以这可能是个愚蠢的问题。我想创建一个模型(“CategoryModel”),其中包含一个字段,指向该模型另一个实例(父实例)的主键ID。

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

我该如何做到这一点?谢谢!


3
从风格上讲,我建议将其称为“parent”而不是“parentId”,因为“my_category_model.parent”将是“CategoryModel”的实例。 Django将自动创建一个成员变量“parent_id”,它将是相关模型的主键。 - Scott
4个回答

364

您可以将模型的名称作为字符串传递给ForeignKey,它会自动处理。

因此:

parent = models.ForeignKey("CategoryModel")

或者您可以使用字符串"self"

parent = models.ForeignKey("self")

1
如果没有设置 null=True / blank=True,如何处理根实例? - zypro
4
@zypro 你不能这样做。你必须将其设为可空。 - Mazhar Ali
3
父级 = models.ForeignKey("self") 更易读 - sultanmyrza

79

12
我想你的意思是“self”,就像这个字符串。在这个上下文中,“self”是未定义的。 - Jared Forsyth
1
@Brandon,你在回答中提到的'self'和Jared在评论中提到的有什么不同吗?"我想你的意思是'self'!!!根据Django文档,两者都是字符串,这很好。有什么提示吗? - Stryker
5
区别在于在定义模型属性时没有“self”关键字。如果该属性作为“__init__()”或其他方法的一部分进行定义,则会出现“self”,因为在 Python 类的任何实例方法中,“self”总是第一个位置参数。 - Brandon Taylor

22

你还需要设置 null=Trueblank=True

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

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


8

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