Since most likely your username
field has unique=True
set, Django REST Framework automatically adds a validator that checks to make sure the new username is unique. You can actually confirm this by doing repr(serializer())
, which will show you all of the automatically generated fields, which includes the validators.
Validation is run in a specific, undocumented order
- Field deserialization called (
serializer.to_internal_value
andfield.run_validators
) serializer.validate_[field]
is called for each field- Serializer-level validators are called (
serializer.run_validation
followed byserializer.run_validators
) serializer.validate
is called
So the problem that you are seeing is that the field-level validation is called before your serializer-level validation. While I wouldn’t recommend it, you can remove the field-level validator by setting extra_kwargs
in your serilalizer’s meta.
class Meta:
extra_kwargs = {
"username": {
"validators": [],
},
}
You will need to re-implement the unique
check in your own validation though, along with any additional validators that have been automatically generated.