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
相关产品推荐
相关产品推荐

