如何使用或Django模型字段验证器?

如何使用或Django模型字段验证器?,django,validation,Django,Validation,有人知道如何使用或组合Django模型字段验证器吗 大概是这样的: example_field = models.CharField(max_length=255, validators=[validator1|validator2]) 我猜有一种方法,它涉及到Q运算符,但我无法找到它的确切含义。您可以在函数本身中进行验证: from django.core.exceptions import ValidationError from django.db import models def

有人知道如何使用或组合Django模型字段验证器吗

大概是这样的:

example_field = models.CharField(max_length=255, validators=[validator1|validator2])

我猜有一种方法,它涉及到Q运算符,但我无法找到它的确切含义。

您可以在函数本身中进行验证:

from django.core.exceptions import ValidationError
from django.db import models

def combined_validator(value):
    try:
        return validator1(value)
    except ValidationError:
        return validator2(value)

class MyModel(models.Model):
    example_field = models.CharField(
        max_length=255,
        validators=[combined_validator]
    )

如果
validator1
未检测到任何故障,则返回控制流,因此我们是安全的。如果它引发了一个
ValidationError
,那么我们就求助于
validator2
。如果这不会引起错误,那么我们又是安全的。否则,错误将从组合验证程序中产生。您可以在函数本身中执行验证:

from django.core.exceptions import ValidationError
from django.db import models

def combined_validator(value):
    try:
        return validator1(value)
    except ValidationError:
        return validator2(value)

class MyModel(models.Model):
    example_field = models.CharField(
        max_length=255,
        validators=[combined_validator]
    )

如果
validator1
未检测到任何故障,则返回控制流,因此我们是安全的。如果它引发了一个
ValidationError
,那么我们就求助于
validator2
。如果这不会引起错误,那么我们又是安全的。否则,错误将从组合的验证器中产生。我还需要一个OR验证器,所以我制作了一个可重用的验证器 可以接受任意数量的子验证器,这些子验证器被合并在一起。 受Django自己的验证器启发,所以应该在任何地方都可以工作(仅在Django Rest框架序列化程序中测试)

来自django.core.exceptions的
导入验证错误
从django.core.validators导入EmailValidator、RegexValidator
从django.utils.deconstruct导入解构
从rest_框架导入序列化程序
@可解构#允许在迁移中使用
类验证程序:
消息='输入有效值。#根据子验证器进行自定义
代码='无效'
def u u init(self,validators,message=None,code=None):
self.validators=验证器
self.\u错误=[]
如果代码不是“无”:
self.code=代码
如果消息不是无:
self.message=消息
定义调用(自身,值):
对于self.validators中的验证程序:
尝试:
返回验证器(值)
除ValidationError为e外:
#保存错误以进行调试
self.\u errors.append(e)
#不匹配,引发错误
引发验证错误(self.message,code=self.code)
定义(自身、其他):
返回(
self.validators==其他.validators和
isinstance(其他、自身类)和
self.message==其他.message和
self.code==其他.code
)
类UsernameValidator(RegexValidator):
regex=re.compile(r'^[-\w]+\Z',re.UNICODE)
#Django Rest框架中的示例用法(也应适用于表单和模型)
类ResetPasswordSerializer(serializers.Serializer):
电子邮件\u或\u用户名=serializers.CharField(
必需=真,
验证器=[
验证器(
[EmailValidator(),UsernameValidator()],
message='输入有效的电子邮件或用户名',
),
],
)

我还需要一个OR验证器,所以我制作了一个可重用的验证器 可以接受任意数量的子验证器,这些子验证器被合并在一起。 受Django自己的验证器启发,所以应该在任何地方都可以工作(仅在Django Rest框架序列化程序中测试)

来自django.core.exceptions的
导入验证错误
从django.core.validators导入EmailValidator、RegexValidator
从django.utils.deconstruct导入解构
从rest_框架导入序列化程序
@可解构#允许在迁移中使用
类验证程序:
消息='输入有效值。#根据子验证器进行自定义
代码='无效'
def u u init(self,validators,message=None,code=None):
self.validators=验证器
self.\u错误=[]
如果代码不是“无”:
self.code=代码
如果消息不是无:
self.message=消息
定义调用(自身,值):
对于self.validators中的验证程序:
尝试:
返回验证器(值)
除ValidationError为e外:
#保存错误以进行调试
self.\u errors.append(e)
#不匹配,引发错误
引发验证错误(self.message,code=self.code)
定义(自身、其他):
返回(
self.validators==其他.validators和
isinstance(其他、自身类)和
self.message==其他.message和
self.code==其他.code
)
类UsernameValidator(RegexValidator):
regex=re.compile(r'^[-\w]+\Z',re.UNICODE)
#Django Rest框架中的示例用法(也应适用于表单和模型)
类ResetPasswordSerializer(serializers.Serializer):
电子邮件\u或\u用户名=serializers.CharField(
必需=真,
验证器=[
验证器(
[EmailValidator(),UsernameValidator()],
message='输入有效的电子邮件或用户名',
),
],
)