Django Rest Framework POST传字符串列表报期望字典错误如何解决?
问题根源
你的报错核心是嵌套序列化器的预期接收结构和你实际提交的参数结构不匹配,同时存在一个语法小问题:
- 你给
autores字段绑定了AutorSerializer(many=True),该序列化器默认期望接收的是包含作者字段的字典列表(比如[{"nome": "Autor 1"}]),但你提交的是纯字符串列表["Autor 1"],所以触发了「期望字典却得到字符串」的报错 AutorSerializer的fields属性写法错误,单个字段必须加末尾逗号才能被识别为元组,否则会被Python判定为普通字符串,后续会触发隐式bug,正确写法是fields = ('nome',)
解决方案
分两种场景,你可以根据自己的需求选择:
场景1:保持现有提交参数格式(传字符串列表)
不需要修改请求结构,直接替换autores字段的序列化器类型,自己处理字符串到作者实例的映射即可,修改后的serializers.py代码如下:
from rest_framework import serializers from rest_framework.serializers import ModelSerializer from .models import Autor, Livro class AutorSerializer(ModelSerializer): class Meta: model = Autor fields = ('nome',) # 修正元组写法 class LivroSerializer(ModelSerializer): # 直接接收字符串列表,不再用嵌套ModelSerializer autores = serializers.ListField( child=serializers.CharField(max_length=100) # 长度和你模型中Autor.nome的max_length保持一致 ) class Meta: model = Livro fields = ('id', 'titulo', 'editora', 'autores') def create_autores(self, autores, livro): for autor_name in autores: # 用get_or_create避免重复创建同名作者,不需要的话可以换回create obj, _ = Autor.objects.get_or_create(nome=autor_name) livro.autores.add(obj) def create(self, validated_data, **kwargs): autores = validated_data.pop('autores') livro = Livro.objects.create(**validated_data) self.create_autores(autores, livro) return livro # 可选:如果响应中需要返回嵌套的作者结构,就加这个方法 def to_representation(self, instance): rep = super().to_representation(instance) rep['autores'] = AutorSerializer(instance.autores.all(), many=True).data return rep
场景2:保持嵌套序列化器的原有逻辑
不需要修改序列化器代码(只需要修正fields的逗号问题),调整请求参数的结构即可:
{ "id": 3435, "titulo": "Livro x", "editora": "Editora x", "foto": "https://i.imgur.com/imagem.jpg", "autores": [{"nome": "Autor 1"}] }
内容的提问来源于stack exchange,提问作者hidantachi
相关产品推荐
相关产品推荐

