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

POST请求JSON解析错误排查及Django DRF代码问题咨询

错误原因分析
  • JSON语法错误:请求数据中artiste字段用数组符号[]包裹键值对,JSON中对象必须用{},这是直接触发解析错误的原因。
  • 序列化器配置错误:LyricsSerializers里song = SongSerializers(many=True),但Lyrics与Song是一对一外键关联,many=True会让序列化器期望数组类型,和模型关系不匹配。
  • API视图逻辑错误:
    • GET方法用SongSerializers序列化Lyrics查询集,序列化器与数据类型完全不匹配;
    • POST方法中试图取出artist字段,实际请求和模型里的字段名是artiste,拼写错误;
    • POST方法的创建逻辑混乱,未正确处理嵌套序列化器的层级数据。
分步解决方法

1. 修正POST请求的JSON格式

将artiste的数组符号改为对象符号,正确的请求数据如下:

{
  "song": {
    "artiste": {
      "first_name": "Kizz",
      "last_name": "Daniel",
      "age": 30
    },
    "title": "Buga",
    "likes": 3
  },
  "content": "chilled music"
}

2. 修正序列化器配置

补充ArtisteSerializer,并调整LyricsSerializers的many=True配置:

# 先定义Artiste序列化器(需匹配Artiste模型字段)
class ArtisteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Artiste
        fields = ["first_name", "last_name", "age"]

class SongSerializers(serializers.ModelSerializer):
    artiste = ArtisteSerializer()
    class Meta:
        model = Song
        fields = ["artiste", "title", "likes"]

class LyricsSerializers(serializers.ModelSerializer):
    song = SongSerializers()  # 移除many=True,匹配一对一关联
    class Meta:
        model = Lyrics
        fields = ["song", "content"]

3. 修正API视图逻辑

修正GET方法

使用正确的序列化器处理Lyrics数据:

def get(self, request):
    lyrics = Lyrics.objects.all()   
    serializer = LyricsSerializers(lyrics, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

修正POST方法

按层级创建关联对象,修正字段名和逻辑:

def post(self, request):
    serializer = LyricsSerializers(data=request.data)
    if serializer.is_valid():
        # 逐层取出嵌套数据
        song_data = serializer.validated_data.pop('song')
        artiste_data = song_data.pop('artiste')
        
        # 依次创建关联对象
        artiste_create = Artiste.objects.create(**artiste_data)
        song_create = Song.objects.create(**song_data, artiste=artiste_create)
        lyrics_create = Lyrics.objects.create(**serializer.validated_data, song=song_create)
        
        # 返回完整序列化数据
        return Response(LyricsSerializers(lyrics_create).data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:10:30