Django модель UniqueConstraint проблема, я хочу, чтобы родитель категории не был текущим экземпляром

Здравствуйте, у меня проблема с родительской категорией. Как вы можете видеть в коде, у меня есть категория с внешним ключом, указывающим на нее саму. Теперь я не хочу, чтобы экземпляр категории был дочерним для нее самой. До сих пор я пробовал unique_together и UniqueConstraint, но это не помогло.

class Category(models.Model):
    parent = models.ForeignKey('self', related_name="children", on_delete=models.CASCADE, blank=True, null=True) #'self' to indicate a self-reference.
    title = models.CharField(max_length=100)
    slug = AutoSlugField(populate_from='title', unique=True, null=False, editable=True)
    logo = models.ImageField(upload_to="catlogo", blank=True, null=True, help_text='Optional')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        #enforcing that there can not be two categories under a parent with same slug
        verbose_name_plural = "categories"
        constraints = [
            models.UniqueConstraint(fields=['slug', 'parent'], name='unique_parent')
        ]

Вы можете добавить некоторые валидации для этого сами, просто перепишите метод validate_unique и добавьте к нему эту валидацию. Попробуйте это.

class Category(models.Model):
    parent = models.ForeignKey('self', related_name="children", on_delete=models.CASCADE, blank=True, null=True) #'self' to indicate a self-reference.
    title = models.CharField(max_length=100)
    slug = AutoSlugField(populate_from='title', unique=True, null=False, editable=True)
    logo = models.ImageField(upload_to="catlogo", blank=True, null=True, help_text='Optional')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
      
        verbose_name_plural = "categories"
    def validate_unique(self, *args, **kwargs):
        super(Category, self).validate_unique(*args, **kwargs)

        if self.__class__.objects.\
                filter(parent=self.parent, slug=self.slug).\
                exists():
            raise ValidationError(
                message='Category with this (parent, slug) already exists.',
                code='unique_together',
            )
Вернуться на верх