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

如何解决Django REST Framework中的"JSON解析错误-额外数据"问题?

DRF "JSON parse error - Extra data" 错误解决方案

核心错误原因

这个错误本质是请求的JSON格式不合法,或者请求头的Content-Type未正确设置,导致DRF的JSON解析器无法正常解析请求数据。结合你只能创建空白帖子的情况,大概率是请求未正确传递JSON数据,request.data为空,所以只能用模型默认值生成空帖子。

具体解决步骤

1. 修正请求的Content-Type与JSON格式

  • 确保请求头中Content-Type设置为application/json,如果用Postman、curl等工具测试,要在请求Body里选择raw -> JSON格式。
  • 发送的JSON必须是单个合法对象,禁止多个对象用逗号分隔(比如错误格式:{"text":"a"},{"text":"b"},正确格式:{"text":"我的测试内容"})。

2. 优化视图与Serializer代码

移除冗余的@csrf_exempt(DRF的api_view已自动处理CSRF逻辑),同时规范author字段的赋值方式,避免手动解构request.data可能引发的问题:

修改views.py

from rest_framework import status
from rest_framework.response import Response

@api_view(['POST'])
def create_post(request):
    # 传递request到serializer的context中
    serializer = PostSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

修改serializer.py

将author设为只读字段,在create方法中自动从当前用户关联的Profile中取值,避免前端传递错误的author ID:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["id", "text", "author", "updated", "created_at", "image", "likes"]
        read_only_fields = ["author", "updated", "created_at", "likes"]  # 后端自动处理的字段设为只读

    def create(self, validated_data):
        # 从context中获取当前用户对应的Profile实例
        profile = self.context['request'].user.profile
        return Post.objects.create(author=profile, **validated_data)

3. 验证Profile与User的关联

确保你的Profile模型存在与User的一对一关联,因为Post的author字段关联到Profile的user字段:

# models.py中的Profile模型示例
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, to_field='id')
    # 其他自定义字段...

4. 正确测试请求

用curl测试示例(需替换为你的API地址和认证凭证):

curl -X POST http://localhost:8000/create_post/ \
  -H "Content-Type: application/json" \
  -H "Authorization: Token YOUR_AUTH_TOKEN" \
  -d '{"text": "这是测试帖子内容"}'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:45:59