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对象与字符串的自动转换:
- 安装依赖(若使用PostgreSQL可跳过,原生支持JSON字段):
pip install jsonfield
- 修改序列化器:
# 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
相关产品推荐
相关产品推荐

