django serializer use fields for validation but exclude from validated_data

62 views Asked by At

I have a serializer:

class ValidateCreateNoCodeEvent(serializers.Serializer):
    ALLOWED_PLATFORM_VALUES = [(1, 'Android'), (2, 'iOS')]
    ALLOWED_GESTURE_TYPES = [
        (0, 'Single Tap'),
        (1, 'Double Tap'),
        (6, 'Long Press')
    ]    
    
    screen_name = serializers.CharField(max_length=100, min_length=1, required=True)
    gesture_type = serializers.ChoiceField(required=True, choices=ALLOWED_GESTURE_TYPES)
    view_type = serializers.CharField(required=True)
    sdk_version = serializers.CharField(required=True)
    platform = serializers.ChoiceField(required=True, choices=ALLOWED_PLATFORM_VALUES)
    element_id = serializers.CharField(required=True, allow_null=False, allow_blank=False)
    name = serializers.CharField(required=True, allow_blank=False, allow_null=False)
    category = serializers.ListField(required=True, min_length=1)
    description = serializers.CharField(required=False, max_length=500)

    def validate_sdk_version(self, sdk_version):
        ... does some validation
        return sdk_version

    def get_fields(self):
        fields = super().get_fields()

        exclude_fields = self.context.get('exclude_fields', [])
        for field in exclude_fields:
            # providing a default prevents a KeyError
            # if the field does not exist
            fields.pop(field, default=None)

        return fields

So I would like to keep, say, platform and sdk_version fields for validation. They are a must for this payload input to proceed further.

However, I would like to exclude them once I access payload.validated_data.

I have tried to add get_fields method which just pops up whatever fields are passed in the context.

context = {
            'exclude_fields': [
                'sdk_version', 'platform'
            ]
        }
payload = ValidateCreateNoCodeEvent(data=request.data, context=context)

So this will also exclude the validation.

How can I fix this?

0

There are 0 answers