Django / DRF raising ValidationErrors in `validate` and bind it to a field

I have a serializer:

class MySerializer(serializers.ModelSerializer):
    name = serailizer.CharField()
    class Meta:
        fields = [
            "name"
        ]

I want to raise a ValidationError when name contain the letter "W"

so i do:

class InvalidNameError(serializers.ValidationError):
    default_detail = _("This name invalid")
    default_code = "invalid_name"

class MySerializer(serializers.ModelSerializer):
    name = serailizer.CharField()

    def validate_name(self, value: str):
        if "W" in value:
            raise InvalidName
        return value

    class Meta:
        fields = [
            "name"
        ]

But instead I want it to be handled in validate

class InvalidNameError(serializers.ValidationError):
    default_detail = _("This name invalid")
    default_code = "invalid_name"

class MySerializer(serializers.ModelSerializer):
    name = serailizer.CharField()

    def validate(self, attrs):
        data = super().validate(attr)
        if "W" in data.get("name", ""):
            raise InvalidName
        return data

    class Meta:
        fields = [
            "name"
        ]

But in the second way, it is flagged as a non_field_errors , I want to do it in validate and still flag it as name in errors

Instead of doing in validate function:

raise InvalidName

You can do:

raise serializers.ValidationError({"name": InvalidNameError().detail})

Here is the documentation that explains it

Вернуться на верх