Я видел, что у некоторых людей была эта проблема передо мной, но на более старых версиях Django, и я работаю 1.2.1.
У меня есть модель, которая похожа:
class Category(models.Model):
objects = CategoryManager()
name = models.CharField(max_length=30, blank=False, null=False)
parent = models.ForeignKey('self', null=True, blank=True, help_text=_('The direct parent category.'))
class Meta:
unique_together = ('name', 'parent')
Каждый раз, когда я пытаюсь сохранить в администраторе категорию с родительским набором ни к Одному, это все еще работает, когда существует другая категория с ТЕМ ЖЕ именем и родительским набором ни к Одному.
Идеи о том, как решить это корректно?
Ограничение уникальной совокупности применяется на уровне базы данных, и похоже, что ваш механизм базы данных не применяет ограничение для значений NULL.
В Django 1.2 вы можете определить чистый метод для своей модели, чтобы обеспечить настраиваемую проверку. В вашем случае вам нужно что-то, что проверяет другие категории с тем же именем, когда родительский элемент None.
class Category(models.Model):
...
def clean(self):
"""
Checks that we do not create multiple categories with
no parent and the same name.
"""
from django.core.exceptions import ValidationError
if self.parent is None and Category.objects.filter(name=self.name, parent=None).exists():
raise ValidationError("Another Category with name=%s and no parent already exists" % self.name)
Если вы редактируете категории через админку Django, метод очистки будет вызываться автоматически. В ваших собственных представлениях вы должны вызвать category.fullclean ()
.