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

Django REST Framework中使用DictField验证Python字典的问题咨询

用Django REST Framework的DictField验证嵌套JSON输入

嘿,作为DRF新手,遇到这种嵌套字典的验证问题太正常了,我来一步步帮你搞定!

首先,DRF里处理输入验证最核心的就是序列化器(Serializer),我们可以结合DictField和嵌套序列化器,精准匹配你的JSON结构需求。

两种场景的实现方式

场景1:输入结构完全固定(比如test下只有name1这个键)

如果你的输入结构是固定不变的,用嵌套序列化器会更严谨,每个层级的字段都能明确校验:

from rest_framework import serializers

# 最内层:校验list和numbers字段
class InnerDataSerializer(serializers.Serializer):
    list = serializers.ListField(child=serializers.CharField())  # 字符串列表
    numbers = serializers.ListField(child=serializers.FloatField())  # 浮点数列表

# 中间层:校验name1对应的结构
class NameDataSerializer(serializers.Serializer):
    name1 = InnerDataSerializer()

# 最外层:校验整个输入的结构
class InputSerializer(serializers.Serializer):
    test = NameDataSerializer()

场景2:输入结构动态(比如test下可以有任意多个类似name1的键)

如果test下面的键是动态的(比如可能有name1、name2等),这时候就轮到DictField出场了——它可以验证字段是字典类型,同时指定每个值的校验规则:

from rest_framework import serializers

class InnerDataSerializer(serializers.Serializer):
    list = serializers.ListField(child=serializers.CharField())
    numbers = serializers.ListField(child=serializers.FloatField())

class InputSerializer(serializers.Serializer):
    # test是一个字典,每个值都要符合InnerDataSerializer的规则
    test = serializers.DictField(child=InnerDataSerializer())

如果连字典的键也需要校验(比如键必须是特定长度的字符串),还可以加上key参数:

test = serializers.DictField(
    key=serializers.CharField(max_length=20),  # 限制键的长度不超过20
    child=InnerDataSerializer()
)

在视图中使用序列化器验证请求

接下来把序列化器用到API视图里,处理Postman发送的POST请求:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

# 你的函数f
def f(d):
    # 这里写你的业务逻辑
    return "处理完成"

class FunctionAPIView(APIView):
    def post(self, request):
        # 用序列化器验证请求数据
        serializer = InputSerializer(data=request.data)
        if serializer.is_valid():
            # 验证通过,拿到清洗后的字典数据
            validated_dict = serializer.validated_data
            # 调用你的函数f
            result = f(validated_dict)
            return Response({"result": result}, status=status.HTTP_200_OK)
        else:
            # 验证失败,返回错误信息
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

小提醒

发送请求时,一定要在Postman的请求头里设置Content-Type: application/json,否则DRF无法正确解析你的JSON请求体哦!

内容的提问来源于stack exchange,提问作者math

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:51