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

Django项目中QueryDict返回异常值的技术咨询

解决Django QueryDict中jsonobj值不符合预期的问题

嘿,看你遇到的这个问题,我之前调试Django API的时候也踩过类似的坑!你看到的jsonobj变成字段名列表的情况,本质是请求的数据格式和视图的解析方式不匹配导致的。下面给你一步步拆解解决方法:

1. 先检查你的requests请求怎么发的

如果你用requests库发POST请求时,把要传的JSON对象直接丢进data参数里,那requests会自动把它编码成application/x-www-form-urlencoded格式——这就会让Django把JSON里的每个键都当成独立的表单字段,最后jsonobj就变成了这些键的列表,完全不是你要的JSON对象。

正确的做法是用json参数来传数据,requests会自动设置Content-Type: application/json,还会帮你序列化JSON:

import requests

# 示例:正确发送JSON数据的方式
payload = {
    "jsonobj": {
        "register_id": "你的值",
        "meter_id": "你的值",
        "reading_date": "你的值",
        # 其他字段...
    }
}
response = requests.post("你的API地址", json=payload)

2. 调整Django视图的解析逻辑

Django的request.POST只处理表单格式的数据(form-data或x-www-form-urlencoded),如果是JSON格式的请求,数据其实在request.body里。你可以直接解析这个原始数据:

from django.http import JsonResponse
import json
from rest_framework.decorators import api_view

@api_view(['GET', 'POST'])
def s0003_view(request):
    if request.method == 'POST':
        try:
            # 解析JSON请求体
            request_data = json.loads(request.body)
            obj = request_data.get('jsonobj')
            print(obj)  # 现在应该是你预期的完整JSON对象了
            return JsonResponse({"status": "success"})
        except json.JSONDecodeError:
            return JsonResponse({"status": "error", "msg": "JSON格式错误"}, status=400)

如果你用了Django REST Framework,更简单——直接用request.data,它会自动识别请求格式并解析:

@api_view(['GET', 'POST'])
def s0003_view(request):
    if request.method == 'POST':
        obj = request.data.get('jsonobj')
        print(obj)
        # 后续业务逻辑...

3. 确认请求的Content-Type

你可以在视图里加一行打印,确认请求头是否正确:

print(request.content_type)

如果输出是application/json,那说明请求格式没问题;如果是application/x-www-form-urlencoded或multipart/form-data,那肯定是requests调用的时候没用到json参数,得改。

4. 特殊情况:必须用form-data传JSON?

如果因为某些限制,你必须用表单格式传JSON,那得先把jsonobj序列化成字符串再传:

import requests
import json

payload = {
    "jsonobj": json.dumps({
        "register_id": "你的值",
        # 其他字段...
    })
}
response = requests.post("你的API地址", data=payload)

然后在视图里把字符串反序列化成JSON对象:

obj_str = request.POST.get('jsonobj')
obj = json.loads(obj_str)

基本上按照这几步来,就能解决你看到的奇怪QueryDict问题了。核心就是确保请求发送的格式和视图解析的方式对应上,别让两边“鸡同鸭讲”~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:31