在Django DRF的validate方法中抛出ValidationError并绑定到指定字段
问题
我有如下DRF序列化器:
class MySerializer(serializers.ModelSerializer): name = serializers.CharField() class Meta: fields = [ "name" ]
需要实现:当name字段包含字母"W"时抛出校验错误。
最初通过字段级校验validate_name实现了需求:
class InvalidNameError(serializers.ValidationError): default_detail = _("This name invalid") default_code = "invalid_name" class MySerializer(serializers.ModelSerializer): name = serializers.CharField() def validate_name(self, value: str): if "W" in value: raise InvalidNameError() return value class Meta: fields = [ "name" ]
但我希望把校验逻辑移到validate方法中,修改后发现错误被标记为non_field_errors,现在需要在validate方法内实现校验,同时让错误关联到name字段。
解决方法
要在validate方法中让错误绑定到指定字段,只需构造一个以字段名为键的错误字典,将其传入ValidationError(或自定义异常类)即可。
调整后的代码:
from rest_framework import serializers from django.utils.translation import gettext_lazy as _ class InvalidNameError(serializers.ValidationError): default_detail = _("This name invalid") default_code = "invalid_name" class MySerializer(serializers.ModelSerializer): name = serializers.CharField() def validate(self, attrs): data = super().validate(attrs) name_value = data.get("name", "") if "W" in name_value: # 将错误信息关联到name字段 raise InvalidNameError({"name": InvalidNameError.default_detail}) return data class Meta: fields = [ "name" ]
补充说明
- DRF会自动识别
ValidationError接收的字典中的键作为字段名,错误信息会被正确关联到对应字段,而非归类为non_field_errors。 - 若不需要自定义异常类,直接使用原生
ValidationError也可以:
raise serializers.ValidationError({"name": _("This name invalid")})
内容的提问来源于stack exchange,提问作者pseudo nyme
相关产品推荐
相关产品推荐

