You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django REST Framework序列化器验证多类型元素列表的JSON?

正确的序列化验证实现方案

先明确你现有代码存在的几个问题:

  1. 字段名不匹配:JSON数据里的键是DEVICE_INFO,但序列化器中用的是device_info,DRF不会自动处理这种大小写差异,需要保持字段名一致或通过source映射。
  2. 错误使用ListSerializer:ListSerializer用于处理嵌套列表(比如[[元素1, 元素2], ...]),但你的DEVICE_INFO是扁平列表,完全不需要嵌套序列化器。
  3. 子字段类型不符合需求:你指定的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:22:35