Django Ninja中Pydantic嵌套模型报value_error.missing错误排查
问题原因及解决方法
出现这个错误的核心原因是接口返回数据里没有deals字段,但新Schema要求必须提供该字段——Swagger显示正确只是因为它仅读取Schema定义,不会校验实际返回的数据。具体场景和解决办法如下:
视图返回结构未匹配Schema调整
原代码返回的是包含offers、sold、bought的对象(比如Django模型实例),但新Schema要求把sold和bought嵌套到deals下。需要手动构造符合新结构的返回数据:# 视图函数示例 def get_user_extra(request, user_id: int): user_extra = UserExtraData.objects.get(id=user_id) return { "offers": user_extra.offers, "deals": { "sold": user_extra.sold, "bought": user_extra.bought } }模型未提供
deals属性
若习惯直接返回模型实例,可给模型添加property方法自动生成deals字段:class UserExtraData(models.Model): offers = models.IntegerField() sold = models.IntegerField() bought = models.IntegerField() @property def deals(self): return {"sold": self.sold, "bought": self.bought}这样返回模型实例时,Pydantic会自动读取该属性完成序列化。
Schema的
deals字段未设置可选/默认值
若业务允许deals为空,可给Schema的deals字段标记为可选并设默认值:from typing import Optional from ninja import Schema class DealsOut(Schema): sold: int bought: int class UserExtraDataOut(Schema): offers: int deals: Optional[DealsOut] = None注意:仅适合允许
deals为空的场景,若业务要求必填,仍需确保返回数据包含deals。Schema定义错误
检查DealsOut与UserExtraDataOut的嵌套关系是否正确,比如deals字段的类型是否写错、DealsOut的字段名是否与实际返回键不匹配。
内容的提问来源于stack exchange,提问作者Vitalii Mytenko
相关产品推荐
相关产品推荐

