Skip to content

For Nested Serializers, the EnforceValidationFieldMixin.run_validation Method is Never Called #28

Open
@NdubisiOnuora

Description

@NdubisiOnuora

Even though EnforceValidationFieldMixin (https://github.com/dealertrack/django-rest-framework-braces/blob/master/drf_braces/serializers/enforce_validation_serializer.py#L10) is added to the MRO of the Serializer and all nested Serializers, the Serializer's.run_validation method still does not run the EnforceValidationFieldMixin.run_validation method or those of any subclasses of EnforceValidationFieldMixin that might override run_validation.

The current problem that I'm trying to solve is to ensure that I can drop errors for invalid data sent to any of the nested Serializers. One example is one in which the nested Serializer expects a dictionary but a list is sent to it instead.

Example:

from drf_braces.serializers.enforce_validation_serializer import create_enforce_validation_serializer, EnforceValidationFieldMixin

from rest_framework import fields, serializers
from rest_framework.fields import empty
from rest_framework.serializers import Serializer


class DropInvalidFieldsMixin(EnforceValidationFieldMixin):

    def run_validation(self, data=empty):
        self.parent.must_validate_fields = []
        try:
            return super(EnforceValidationFieldMixin, self).run_validation(data)
        except serializers.ValidationError:
            field_name = getattr(self, "field_name")
            raise fields.SkipField(
                'This field "{}" is being skipped as per enforce validation logic.'
                ''.format(field_name)
            )


class PlayerSerializer(Serializer):
    name = fields.CharField()


class PlayersSerializer(Serializer):
    player = PlayerSerializer(many=True)


class GameSerializer(Serializer):
    name = fields.CharField()
    country_of_origin = fields.CharField(required=False)
    players = PlayersSerializer(required=False)


serializer_class = create_enforce_validation_serializer(GameSerializer, strict_mode_by_default=False)

serializer = serializer_class(data={"name": "Chop the Money", "country_of_origin": "Nigeria", "players": [{"name": "Olusegun Obasanjo"}, {"name": "Sani Abacha"}] })

>>> serializer.is_valid()
>>> {'players': {u'non_field_errors': [ErrorDetail(string=u'Invalid data. Expected a dictionary, but got list.', code=u'invalid')]}}

I expect that the GameSerializer be valid and the incorrect data in the PlayersSerializer be dropped especially since self.parent.must_validate_fields is set to an empty list in DropInvalidFieldsMixin.run_validation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions