DRF中获取前端的参数为QueryDict类型—已解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF中获取前端的参数为QueryDict类型—已解决相关的知识,希望对你有一定的参考价值。

参考技术A 问题描述:前端传递对象数组给后端实现新增问卷的功能,后端打印 print(request.data) 得到的是 QueryDict类型的数据。

原因:封装的post请求设置了Content-Type为application/x-www-form-urlencoded类型,所以request.data拿到的是QueryDict类型。

解决方法:

1. 将Content-Type设置为application/json

2. 将请求数据对象或值转换为  JSON  字符串

结果:正确获取数据,添加成功!

参考文章: django rest framework 获取前端参数的几种方式

python DRF获取参数介绍

DRF获取参数的方式

例如url
url(r^demo/(?P<word>.*)/$, DemoView.as_view())
在类视图中获取参数
url:http://127.0.0.1:8000/demo/aaa/?bbb=bbb&ccc=ccc&ccc=CCC
form:{"body":"body"}
JSON:{"body":"body"}
class DemoView(APIView):

    def post(self, request, aaa):
        aaa = aaa  # 获取url路径中的参数
        bbb_str = request.query_params.get(bbb)  # 获取一个查询字符串的参数
        ccc_list = request.query_params.getlist(ccc)  # 获取多个查询字符串参数
        # 请求体中的参数
        # 如果通过form表单传递,获取出来是QueryDict,通过.dict()转换成python的字典
        form_body = request.data
        # 如果通过JSON传递,获取出来就是字典,例如{‘body‘:‘body‘}
        # json_body = request.data
        print(aaa)
        print(bbb_str)
        print(ccc_list)
        print(form_body.dict())
        # print(json_body)
        return Response({message: OK})
结果
aaa
bbb
[ccc, CCC]
{body: body}
URL路径参数/查询字符串不区分请求方式,GET/POST/PUT等都一样
serializer中获取参数
# view
class DemoView(GenericAPIView):
    serializer_class = DemoSerializer

    def post(self, request, aaa):
        serializer = self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)
        return Response({message: OK})

# serializer
class DemoSerializer(serializers.Serializer):
    bbb = serializers.CharField()
    ccc = serializers.ListField()  # List

    def validate(self, attrs):
        aaa = self.context[view].kwargs.get(aaa)  # 获取路径参数
        bbb = attrs[bbb]  # 获取查询字符串
        ccc = attrs[ccc]  # 获取以多个key相同的查询字符串
        # 获取当前登陆的对象,需要根据场景进行使用
        # user = self.context[‘request‘].user
        print(aaa)
        print(bbb)
        print(ccc)
        return attrs

 

以上是关于DRF中获取前端的参数为QueryDict类型—已解决的主要内容,如果未能解决你的问题,请参考以下文章

Drf模块详细分析

django基础知识之QueryDict对象:

Django QueryDict 获取合并的 GET 参数

python DRF获取参数介绍

drf框架相关

django 获取查询字符串的参数