可插拔验证管道:设计模型与表单的渐进式验证引擎
不满足于简单的 clean() 方法,实现一个链式验证器(Validator Pipeline),支持按顺序执行多个独立验证规则。 · 难度:入门 · +10XP
可插拔验证管道:设计模型与表单的渐进式验证引擎
Django 内置验证(如 validators = [RegexValidator])功能单一。本教程将设计一个 PipelineValidator,它接收一组验证函数(callable),每个函数返回 True/False 或抛出 ValidationError。支持条件跳过(如仅当字段 A 非空时才验证字段 B)、错误汇总(一次性返回所有错误)。你可以在模型字段、表单字段、甚至 DRF Serializer 中复用这套管道。最终实现类似 'email | required | unique | format' 的声明式验证。
class PipelineValidator:
def __init__(self, *validators):
self.validators = validators
def __call__(self, value):
errors = []
for validator in self.validators:
try:
validator(value)
except ValidationError as e:
errors.append(e.message)
if errors:
raise ValidationError(', '.join(errors))
# 使用
class OrderForm(forms.Form):
coupon = forms.CharField(
validators=[
PipelineValidator(
validate_not_expired,
validate_minimum_order,
)
]
)