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

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

我有一个serializer:

  1. class ValidateCreateNoCodeEvent(serializers.Serializer):
  2. ALLOWED_PLATFORM_VALUES = [(1, 'Android'), (2, 'iOS')]
  3. ALLOWED_GESTURE_TYPES = [
  4. (0, 'Single Tap'),
  5. (1, 'Double Tap'),
  6. (6, 'Long Press')
  7. ]
  8. screen_name = serializers.CharField(max_length=100, min_length=1, required=True)
  9. gesture_type = serializers.ChoiceField(required=True, choices=ALLOWED_GESTURE_TYPES)
  10. view_type = serializers.CharField(required=True)
  11. sdk_version = serializers.CharField(required=True)
  12. platform = serializers.ChoiceField(required=True, choices=ALLOWED_PLATFORM_VALUES)
  13. element_id = serializers.CharField(required=True, allow_null=False, allow_blank=False)
  14. name = serializers.CharField(required=True, allow_blank=False, allow_null=False)
  15. category = serializers.ListField(required=True, min_length=1)
  16. description = serializers.CharField(required=False, max_length=500)
  17. def validate_sdk_version(self, sdk_version):
  18. ... does some validation
  19. return sdk_version
  20. def get_fields(self):
  21. fields = super().get_fields()
  22. exclude_fields = self.context.get('exclude_fields', [])
  23. for field in exclude_fields:
  24. # providing a default prevents a KeyError
  25. # if the field does not exist
  26. fields.pop(field, default=None)
  27. return fields

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

  1. context = {
  2. 'exclude_fields': [
  3. 'sdk_version', 'platform'
  4. ]
  5. }
  6. payload = ValidateCreateNoCodeEvent(data=request.data, context=context)

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

cbwuti44

cbwuti441#

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

  1. def to_internal_value(self, data):
  2. # Get the original validated data
  3. validated_data = super().to_internal_value(data)
  4. # Exclude the fields from the validated data, while keeping them for validation
  5. validated_data.pop('sdk_version', None)
  6. validated_data.pop('platform', None)
  7. return validated_data

相关问题