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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:55