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

