繁体   English   中英

Pydantic 嵌套 model 字段抛出 value_error.missing

[英]Pydantic nested model field throws value_error.missing

以下代码在 Django 和 Ninja API 框架下运行良好。 数据验证架构:

class OfferBase(Schema):
    """Base offer schema."""

    id: int
    currency_to_sell_id: int
    currency_to_buy_id: int
    amount: float
    exchange_rate: float
    user_id: int
    added_time: datetime = None
    active_state: bool = True


class DealBase(Schema):
    """Base deal schema."""

    id: int
    seller_id: int
    buyer_id: int
    offer_id: int
    deal_time: datetime = None


class UserExtraDataOut(UserBase):
    """Extended user schema with extra data response."""

    offers: List[OfferBase]
    sold: List[DealBase]
    bought: List[DealBase]

用户为 object 的端点。请注意,用户 model 未被修改:

@api.get("/users/{user_id}", response=UserExtraDataOut, tags=["User"])
def get_user_info(request, user_id):
    """Get user profile information with offers and deals."""
    user = get_object_or_404(User, pk=user_id)
    return user

成交model:

class Deal(models.Model):
    """Deal model."""

    seller = models.ForeignKey(
        to=User, related_name="sold", on_delete=models.PROTECT, verbose_name="Seller"
    )
    buyer = models.ForeignKey(
        to=User, related_name="bought", on_delete=models.PROTECT, verbose_name="Buyer"
    )
    offer = models.ForeignKey(
        to="Offer", on_delete=models.PROTECT, verbose_name="Offer"
    )
    deal_time = models.DateTimeField(auto_now=True, verbose_name="Time")

它给了我这个回应:

{
  "id": 0,
  "username": "string",
  "first_name": "string",
  "last_name": "string",
  "email": "string",
  "offers": [
    {
      "id": 0,
      "currency_to_sell_id": 0,
      "currency_to_buy_id": 0,
      "amount": 0,
      "exchange_rate": 0,
      "user_id": 0,
      "added_time": "2022-11-22T18:37:47.573Z",
      "active_state": true
    }
  ],
  "sold": [
    {
      "id": 0,
      "seller_id": 0,
      "buyer_id": 0,
      "offer_id": 0,
      "deal_time": "2022-11-22T18:37:47.573Z"
    }
  ],
  "bought": [
    {
      "id": 0,
      "seller_id": 0,
      "buyer_id": 0,
      "offer_id": 0,
      "deal_time": "2022-11-22T18:37:47.573Z"
    }
  ]
}

但是,我希望soldbought字段嵌套到deals中。 我用这段代码来做:

class DealExtraDataOut(Schema):
    """Extended user schema with extra data response."""

    sold: List[DealBase]
    bought: List[DealBase]


class UserExtraDataOut(UserBase):
    """Extended user schema with extra data response."""

    offers: List[OfferBase]
    deals: DealExtraDataOut  # extend this from DealExtraDataOut

Swagger中的方案是正确的:

  ...
  "deals": {
    "sold": [
      {
        ...
      }
    ],
    "bought": [
      {
        ...
      }
    ]
  }

但是执行会给我一个错误:

pydantic.error_wrappers.ValidationError: 1 validation error for NinjaResponseSchema
response -> deals
  field required (type=value_error.missing)

怎么了?

这就是我要找的:

class OfferWithDealOut(OfferBase):
    """Offer schema for POST method."""

    deal: List[DealBase] = Field(..., alias="deal_set")

class UserBase(Schema):
    """Base user schema for GET method."""

    id: int
    username: str
    first_name: str
    last_name: str
    email: str


class UserExtraDataOut(UserBase):
    """Extended user schema with extra data response."""

    offers: List[OfferWithDealOut]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM