Django unique_together не работает с ForeignKey=None

Я видел, что у некоторых людей была эта проблема передо мной, но на более старых версиях 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')

Каждый раз, когда я пытаюсь сохранить в администраторе категорию с родительским набором ни к Одному, это все еще работает, когда существует другая категория с ТЕМ ЖЕ именем и родительским набором ни к Одному.

Идеи о том, как решить это корректно?

8
задан ydaniv 15 August 2010 в 16:43
поделиться

1 ответ

Ограничение уникальной совокупности применяется на уровне базы данных, и похоже, что ваш механизм базы данных не применяет ограничение для значений 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 () .

10
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: