我有一个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
所以我想保留platform
和sdk_version
字段用于验证。它们是该有效载荷输入进一步进行所必须的。
但是,我想在访问payload.validated_data
后排除它们。
我试着添加get_fields
方法,它只会弹出上下文中传递的任何字段。
context = {
'exclude_fields': [
'sdk_version', 'platform'
]
}
payload = ValidateCreateNoCodeEvent(data=request.data, context=context)
因此,这也将排除验证。
我该怎么解决这个问题?
1条答案
按热度按时间cbwuti441#
你可以使用
to_internal_value
来覆盖序列化器中的to_internal_value方法。此方法负责将传入的JSON数据转换为可以验证的Python数据结构。