queryset password framework foreign fields exclude error create django django-rest-framework serializer

password - django rest framework: establece un error de nivel de campo desde el método validar() del serializador



django rest framework validation error (3)

De manera similar a la respuesta de @ Jkk.jonah, esto genera un error de ValidationError , pero reutiliza el texto de excepción original sin necesidad de volver a implementar las traducciones:

try: serializer.fields[''field_val1''].fail(''required'') except ValidationError as exc: raise ValidationError({ ''field_val1'': exc.detail, })

Por defecto (es decir, en la clase rest_framework.fields.Field ), las claves disponibles son:

default_error_messages = { ''required'': _(''This field is required.''), ''null'': _(''This field may not be null.'') }

Las subclases pueden agregar sus propios mensajes de error allí (y Serializer es una subclase de Field ).

Por cierto, los nuevos mensajes de error se fusionarán automáticamente con los mensajes existentes (heredados), no se anularán como podría esperarse.

Tengo un serializador que valida los campos en función de los valores de otros campos. En la respuesta de error me gustaría mostrar cada error de campo como un error de campo en lugar de mostrar todo bajo "non_field_errors", que es lo que sucedería si tuviera que generar un ValidationError en el método de validación a nivel de objeto. A continuación se muestra una ilustración de lo que estoy tratando de lograr:

MySerializer(ModelSerializer): ... def validate(self, data): field_val1 = data[''field_val1''] field_val2 = data[''field_val2''] if not self._is_field_valid(field_val1, field_val2): # The below line is how I would do what I want with Django # Forms, however, it''s not valid in DRF self._errors[''field_val1''] = ''this field is not valid''

La respuesta de error deseada es:

{''field_val1'': [''this field is not valid'']}


Lo descubrí, en this página de la documentación en la sección "BaseSerializer", hay un ejemplo que muestra que ValidationError puede tomar un argumento de diccionario en la inicialización.

Si raise ValidationError({''field_val1'': [''this field is not valid'']}) Obtengo la respuesta JSON que quiero.


Si tiene una lógica que se aplica a todos los campos, aún puede obtener el resultado deseado haciendo esto:

def validate(self, data): for key, value in data.items(): # checks if value is empty if not value: raise serializers.ValidationError({key: "This field should not be left empty."}) return data