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

Django REST Framework POST嵌套JSON报错:Not a valid string

问题分析与解决:Django REST Framework嵌套JSON提交报错"Not a valid string"

搭建测试API时,模型包含一个类与两个字段,视图集继承ModelViewSet并自定义了list和create方法,普通JSON请求可正常提交,但提交嵌套JSON请求时返回"Not a valid string"错误,以下是详细分析与解决办法:


相关代码与请求信息

views.py代码

class SessionViewset(viewsets.ModelViewSet):
    """
    A simple viewset for listing or retrieving 'sessions'
    """
    queryset = Session.objects.all()
    serializer_class = SessionSerializer

    def list(self, request):
        queryset = Session.objects.all()
        serializer = SessionSerializer(queryset, many=True)
        return Response(serializer.data)
    
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

提交的请求JSON

{
    "meta":"aca va la metadata",
    "reunion":{"juan":500,
            "pedro":300,
            "jose":1000}
}

错误返回结果

{
    "reunion": [
        "Not a valid string."
    ]
}

模型与序列化器核心信息

从截图可推断:

  • 模型中reunion字段为字符串类型(CharField或TextField)
  • 序列化器默认使用字符串字段的处理逻辑

问题原因

提交的reunion是嵌套JSON对象,但模型和序列化器将该字段定义为字符串类型,DRF默认的字符串字段会尝试直接将JSON对象识别为字符串,而对象无法被解析为有效字符串,因此抛出验证错误。


解决办法

方案1:适配现有模型,自动处理JSON字符串与对象转换

如果不想修改模型结构,可通过序列化器实现JSON对象与字符串的自动转换:

  1. 安装依赖(若使用PostgreSQL可跳过,原生支持JSON字段):
pip install jsonfield
  1. 修改序列化器:
# serializers.py
from rest_framework import serializers
from .models import Session
from jsonfield import JSONField

class SessionSerializer(serializers.ModelSerializer):
    reunion = serializers.JSONField()

    class Meta:
        model = Session
        fields = ['meta', 'reunion']

此时提交原嵌套JSON请求即可,序列化器会自动将JSON对象转为字符串存储,读取时再转回对象。

方案2:修改模型字段为JSON类型(推荐)

若数据库支持(PostgreSQL、MySQL 5.7+等),直接将模型字段改为JSON类型,更贴合业务需求:

# models.py
from django.db import models
# PostgreSQL用以下导入,MySQL 5.7+直接用from django.db.models import JSONField
from django.contrib.postgres.fields import JSONField

class Session(models.Model):
    meta = models.CharField(max_length=255)
    reunion = JSONField()  # 替换原字符串类型字段

序列化器无需额外修改,DRF会自动处理JSON对象的序列化与反序列化,原嵌套JSON请求可直接正常提交。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:30:57