Django DRF嵌套序列化器创建对象报错:期望字典却收到字符串
DRF序列化器验证失败问题解决办法
你遇到的这个报错原因很清晰:你的Model_Serializer里的a_ref字段用了嵌套的A_Serializer(many=True),这个序列化器默认期望接收字典列表,但你传入的是纯字符串列表["17629","17630","17631"],所以DRF才会抛出“Invalid data. Expected a dictionary, but got str.”的错误。
根据你的实际需求,有两种可行的解决方式:
方式一:关联已存在的A对象(推荐,如果你不需要创建新A)
如果你的需求是把已有的A对象关联到新创建的Model实例上,不需要创建新的A对象,那完全不需要用嵌套序列化器,直接用PrimaryKeyRelatedField就可以:
class Model_Serializer(serializers.ModelSerializer): # 替换成PrimaryKeyRelatedField,支持传入pk列表 a_ref = serializers.PrimaryKeyRelatedField( many=True, queryset=A.objects.all() # 指定可关联的A对象范围,DRF会自动验证pk是否存在 ) class Meta: model = models.Model fields = ('a_ref',) # 根据你的实际需求添加其他字段
修改后,你原来的data = { 'a_ref':["17629","17630","17631"] }就能正常通过验证,DRF会自动处理Model和A对象的关联,甚至不需要重写create方法(除非你有额外的业务逻辑要处理)。
方式二:创建新的A对象(如果确实需要生成新A)
如果你必须通过传入的pk值创建新的A对象(注意:通常模型的pk是自动生成的,除非你自定义了主键字段),那需要调整传入的数据格式,把每个字符串包装成包含pk字段的字典:
data = { 'a_ref':[{"pk": "17629"}, {"pk": "17630"}, {"pk": "17631"}] }
保持你原来的序列化器代码不变,这样A_Serializer就能正确解析每个字典数据,执行后续的创建逻辑了。
内容的提问来源于stack exchange,提问作者user2239318
相关产品推荐
相关产品推荐

