Django `UniqueConstraint` 异常处理与 'unique=True' 相同

Django `UniqueConstraint` exception handled the same as '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 <b>clean_identifier</b>(self):
        data = self.cleaned_data['identifier']
        if MyModel.objecs.exclude(pk=self.instance.pk).filter(<strong>identifier__iexact=data</strong>).exists():
            raise ValidationError('The identifier already exists')
        return data
    
    class Meta:
        model = MyModel
        fields = ['identifier']