You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 11:35:55