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

Django测试传递JSON数据触发ValueError问题求助

Django测试GET请求传JSON报错的解决办法

问题根源

你碰到的ValueError: not enough values to unpack (expected 2, got 1)是因为Django测试客户端的get方法对data参数的处理逻辑:

  • 当你传JSON字符串给data时,客户端会把它当作URL查询参数解析(按&和=拆分键值对),但JSON格式里没有=,解析时拆不出键值对就会报错。
  • 直接传字典收空,大概率是视图里用错了参数获取方式(比如用request.POST或DRF的request.data),GET请求的参数本来就存在于URL查询字符串里,而非请求体。

解决方案

方案1:符合HTTP规范的GET传参(推荐)

GET请求的参数理应放在URL查询字符串中,测试代码直接传字典给data参数,客户端会自动编码成查询字符串:

req_body = {"Value1":"Value1", "Value2":"Value2"}
request = self.client.get(self.getSingleData_url, data=req_body)

视图里对应使用request.GET获取参数(DRF视图用request.query_params):

# 普通Django视图
def your_view(request):
    value1 = request.GET.get("Value1")
    value2 = request.GET.get("Value2")
    # 业务逻辑处理...

# DRF视图
from rest_framework.views import APIView
class YourView(APIView):
    def get(self, request):
        value1 = request.query_params.get("Value1")
        value2 = request.query_params.get("Value2")
        # 业务逻辑处理...

方案2:硬要给GET请求传JSON请求体(不推荐)

如果业务必须让GET请求从请求体读取JSON(不符合HTTP规范,不建议这么做),别用client.get,改用client.generic手动指定请求体:

import json
req_body = {"Value1":"Value1", "Value2":"Value2"}
request = self.client.generic(
    'GET', 
    self.getSingleData_url, 
    body=json.dumps(req_body), 
    content_type='application/json'
)

对应的视图需要手动解析请求体:

import json
from django.http import JsonResponse

def your_view(request):
    if request.method == "GET":
        try:
            data = json.loads(request.body)
        except json.JSONDecodeError:
            return JsonResponse({"error": "无效JSON格式"}, status=400)
        # 业务逻辑处理...
        return JsonResponse(data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:30:53