在表中与外键一起指向自身

时间:2011-01-07 11:27:40

标签: django django-models

我有一张描述的表:

name = models.CharField(max_length=70)
parent = models.ForeignKey('self', null=True, blank=True)

让我们假设我们有两个父母:

表(id = 1,name =“first”) 表(id = 2,name =“second”)

当我创造孩子时:

表(name =“first”,parent = 1) 表(name =“first”,parent = 2)

保存对象应该通过,但是当我再次输入并保存

表(name =“first_child”,parent = 1)

它应该失败。我该怎么做?名称中的唯一不是解决方案,因为父级和子级可以具有相同的名称。

2 个答案:

答案 0 :(得分:2)

使用unique=TrueOnetoOneKey代替ForeignKey。请参阅documentation

答案 1 :(得分:0)

正如我在评论中写的那样

unique_together = ('name', 'parent')

是好方法,这只是解决方案的一部分。我也用这样的代码制作了干净的功能:

    if self.parent is None:
        try:
            result = Table.objects.filter(name=self.name, parent=None)
            if result.count():
                raise
        except Exception as ex:
            raise ValidationError('Record with this name already exists')

此部分检查是否没有父母的记录。所以它的工作方式与众不同,但仅适用于没有父母的记录。