调用create()时非必填字段children触发Serializer KeyError问题排查
问题原因及解决方案
核心原因
你遇到的KeyError: 'children'是因为在实例未保存到数据库前,尝试访问反向关联字段children。
children是通过parent字段的related_name生成的反向关联属性,只有当Task实例被保存到数据库后,Django才会为其建立这个反向关联的查询入口。而你在create方法中,刚执行完serializer.is_valid()就去取serializer.data,此时序列化器对应的实例还未创建(还没调用save()),自然找不到children这个属性。
你设置的required=False、read_only=True是用于请求数据验证阶段的规则,和序列化输出时的字段获取逻辑无关,所以无法解决这个问题。
解决方案
修改create方法,先调用serializer.save()创建数据库实例,之后再访问serializer.data:
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 先保存实例到数据库,生成有效实例 instance = serializer.save() # 此时再访问serializer.data就可以正常获取children字段(空列表) inputs = serializer.data # 后续业务逻辑... return Response(serializer.data, status=status.HTTP_201_CREATED)
额外说明
如果你的业务逻辑不需要在创建实例后立即获取children字段,也可以直接操作save()返回的instance对象,而不必依赖serializer.data。
内容的提问来源于stack exchange,提问作者Adam Starrh
相关产品推荐
相关产品推荐

