python django serializer使用字段进行验证,但从validated_data中排除

zbdgwd5y  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(184)

我有一个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

所以我想保留platformsdk_version字段用于验证。它们是该有效载荷输入进一步进行所必须的。
但是,我想在访问payload.validated_data后排除它们。
我试着添加get_fields方法,它只会弹出上下文中传递的任何字段。

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

因此,这也将排除验证。
我该怎么解决这个问题?

cbwuti44

cbwuti441#

你可以使用to_internal_value来覆盖序列化器中的to_internal_value方法。此方法负责将传入的JSON数据转换为可以验证的Python数据结构。

def to_internal_value(self, data):
        # Get the original validated data
        validated_data = super().to_internal_value(data)

        # Exclude the fields from the validated data, while keeping them for validation
        validated_data.pop('sdk_version', None)
        validated_data.pop('platform', None)

        return validated_data

相关问题