如何限制Django ORM中外键关系的数字?

时间:2020-07-02 05:43:01

标签: django foreign-keys django-orm

我有一个与其自身递归相关的模型。内容如下。

class Category(models.Model):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey(
        'self', blank=True, null=True,
        related_name='children', on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        path = [self.name, ]
        node = self.parent
        while node is not None:
            path.append(node.name)
            node = node.parent
        return '->'.join(path[::-1])

我要实现的一点验证是防止超过3个孩子成为父类别。 例如,如果我在上面创建为状态,则将其保存如下:

Programming->Back-end->Python->ifelse.

我的问题:如何防止父类别的孩子超过3个?

1 个答案:

答案 0 :(得分:1)

您可以尝试model validation

from django.core.exceptions import ValidationError


class Category(models.Model):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey(
        'self', blank=True, null=True,
        related_name='children', on_delete=models.CASCADE)

    def clean(self):
        if self.parent:
            if self.get_parents_length(self) > 3:
                raise ValidationError("Parent has already got 3 children!")

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        path = [self.name, ]
        node = self.parent
        while node is not None:
            path.append(node.name)
            node = node.parent
        return '->'.join(path[::-1])

    @staticmethod
    def get_parents_length(cat):
        parents = [cat.name]
        node = cat.parent
        while node is not None:
            parents.append(node.name)
            node = node.parent
        return len(parents)

相关问题