Исключение Django `UniqueConstraint` обрабатывается так же, как и 'unique=True'

При нарушении UniqueConstraint модели возникает исключение. Как сделать так, чтобы оно вело себя так же, как нарушение поля с unique=True?

identifier = models.CharField("id", max_length=30, unique=True, blank=True, null=True, validators=[validate_id])

class Meta:
    constraints = [
        models.UniqueConstraint(
            Lower("identifier"),
            name="id_case_insensitive_constraint"
        )
    ]

Здесь я хочу, чтобы form_invalid вызывалась форма с теми же ошибками полей и все такое, независимо от того, является ли ввод точно таким же, как и другой, или его единственным отличием является различие регистров.

Ограничения не транслируются в валидаторы: проверка выполняется полностью на стороне базы данных, поэтому Django не может заранее знать, что элемент будет недействительным.

Вы можете сделать валидатор, например, в ModelForm, чтобы проверить это самостоятельно, с:

from django import forms
from django.core.exceptions import ValidationError

class MyModelForm(forms.ModelForm):
    
    def clean_identifier(self):
        data = self.cleaned_data['identifier']
        if MyModel.objecs.exclude(pk=self.instance.pk).filter(identifier__iexact=data).exists():
            raise ValidationError('The identifier already exists')
        return data
    
    class Meta:
        model = MyModel
        fields = ['identifier']
Вернуться на верх