Olá Denis, tudo bem com você?
Peço desculpas pela demora no retorno.
O comportamento descrito está ocorrendo devido à validação padrão do Django ser executada antes da validação personalizada que foi definida no serializer. Portanto, se houver um erro de validação padrão, ele será retornado antes mesmo de chegar à sua função validate()
personalizada. Essa validação padrão, é a que definimos em nosso modelo, onde por exemplo, o tamanho máximo do campo cpf
é 11 dígitos, o tamanho máximo do campo celular
é 14 e assim sucessivamente.
Todavia, para abarcar as validações do serializer
em conjunto, podemos definir um dicionário que coleta todos os erros e os retorna em conjunto, como mostro abaixo:
from rest_framework import serializers
from clientes.models import Cliente
from clientes.validators import *
class ClienteSerializer(serializers.ModelSerializer):
class Meta:
model = Cliente
fields = '__all__'
def validate(self, data):
errors = {}
if not cpf_valido(data['cpf']):
errors['cpf'] = "Número de CPF inválido"
if not nome_valido(data['nome']):
errors['nome'] = "Não inclua números neste campo"
if not rg_valido(data['rg']):
errors['rg'] = "O RG deve ter 9 dígitos"
if not celular_valido(data['celular']):
errors['celular'] = "O número de celular deve seguir este modelo: 11 91234-1234 (respeitando os espaços e traço)"
if errors:
raise serializers.ValidationError(errors)
return data
Abaixo, um gif que apresenta o resultado, após a mudança no arquivo serializers.py:
Todavia, ressalto que quando houver erros padrões do modelo, será exibido apenas os erros do modelo - o que não inclui as validações personalizadas. Ou seja, se houver erros de validação do modelo, os erros personalizados definidos no método validate
do serializer podem não ser acionados.
Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.
Em caso de dúvidas estou à disposição.
Abraços e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!