django 序列化程序使用字段进行验证但从 validated_data 中排除

问题描述 投票:0回答:0

我有一个序列化程序:

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

所以我想保留

platform
sdk_version
字段进行验证。它们是此有效载荷输入继续进行所必需的。

但是,一旦我访问

payload.validated_data
.

,我想排除它们

我尝试添加

get_fields
方法,它只弹出上下文中传递的任何字段。

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

所以这也将排除验证。

我该如何解决这个问题?

python django backend django-serializer django-validation
© www.soinside.com 2019 - 2024. All rights reserved.