当违反模型的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']

Django相关问答推荐

在不指定查找的情况下调用 prefetch_lated() 有用吗?

如何在 Django 模型中存储元组列表

重建 Dockerfile 后,Django celery 无法从celery导入名称Celery

在用例图中建模前端和后端

如何在 Django 中创建一个独特的 slug

Django RESTful API - django-piston vs. django-tastypie

如何获得用户权限?

恢复 Django 1.7 RemoveField 迁移

是否可以在没有模型的情况下创建自定义管理视图

如何在 django 中处理这种竞争条件?

Django ModelForm 没有指定模型类

django.request 记录器没有传播到根目录?

django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置

从基于类的通用视图中获取 request.session

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

用于创建和更新的基于 Django 类的视图

您如何在本地针对 OpenID 进行开发

在 django 中获取空查询集的类名

在 Django 中查询 top x 元素