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',
)