如何用Django REST Framework序列化器验证多类型元素列表的JSON?
正确的序列化验证实现方案
先明确你现有代码存在的几个问题:
- 字段名不匹配:JSON数据里的键是
DEVICE_INFO,但序列化器中用的是device_info,DRF不会自动处理这种大小写差异,需要保持字段名一致或通过source映射。 - 错误使用
ListSerializer:ListSerializer用于处理嵌套列表(比如[[元素1, 元素2], ...]),但你的DEVICE_INFO是扁平列表,完全不需要嵌套序列化器。 - 子字段类型不符合需求:你指定的
CharField和BooleanField无法匹配数据中的整数类型,且列表是单个元素的序列,不是固定结构的子列表。
方案1:允许列表元素为任意合法类型
如果只需要验证DEVICE_INFO是列表格式,不对元素类型做严格限制,可以直接用ListField搭配基类Field:
from rest_framework import serializers class SensairValidateFormSerializer(serializers.Serializer): start_hour = serializers.CharField(required=True) # 保持字段名与JSON一致,或者用source='DEVICE_INFO'做映射 DEVICE_INFO = serializers.ListField( child=serializers.Field(), # 接受任意类型的元素 required=False )
方案2:严格限制元素为字符串、整数、布尔值
如果需要确保列表中的每个元素只能是字符串、整数或布尔值,添加自定义验证逻辑:
from rest_framework import serializers class SensairValidateFormSerializer(serializers.Serializer): start_hour = serializers.CharField(required=True) DEVICE_INFO = serializers.ListField(required=False) def validate_DEVICE_INFO(self, value): # 定义允许的元素类型 allowed_types = (str, int, bool) for item in value: if not isinstance(item, allowed_types): raise serializers.ValidationError( f"元素 '{item}' 的类型 {type(item).__name__} 不合法,仅支持字符串、整数、布尔值" ) return value
补充说明
如果希望保持序列化器字段名为下划线风格的device_info,可以通过source参数映射到JSON的DEVICE_INFO:
device_info = serializers.ListField( child=serializers.Field(), source='DEVICE_INFO', required=False )
内容的提问来源于stack exchange,提问作者MalloryLP
相关产品推荐
相关产品推荐

