【问题标题】:Fastapi how to convert string to list when calling get methos?Fastapi如何在调用get方法时将字符串转换为列表?
【发布时间】:2023-01-30 01:12:15
【问题描述】:

我正在使用 mysql 数据库,如果我在我的 mysql 数据库中存储像“apple”,“banana”这样的字符串,那么当使用 get 方法 fastapi 如何将主题从字符串转换为像 [“apple”,“banana”这样的列表时,它不支持列表”]。我试过了,但没有用,也没有得到图像字段,直到我删除@property。

class Shop_page(BaseModel):
      product_title: str
      product_image: str
      class Config():
          orm_mode = True
      @property
      def product_image(self):
        return self.product_image.split(",")

这是我的获取方法

@router.get("/shop_page", response_model=List[schemas.Shop_page],status_code=status.HTTP_200_OK)
async def create_variations(db: Session = Depends(get_db)):
          parent_item = db.query(models.ParentProduct).all()
          return parent_item

我的结果现在看起来像

[
  {
    "product_title": "DEMO PRODUCT",
    "product_image": "image1_url,image2_url"
  }
]

我的预期结果将是这样的

[
      {
        "product_title": "DEMO PRODUCT",
        "product_image": ["image1_url,image2_url"]
      }
    ]

【问题讨论】:

标签: python mysql arrays python-3.x fastapi


【解决方案1】:

Pydantic does not support @property decorator serializing

而且我认为您可以按如下方式重写 from_orm 方法:

from typing import Type, Any

from pydantic import BaseModel, validator


class ShopPage(BaseModel):
    product_title: str
    product_image: list

    class Config:
        orm_mode = True

    def from_orm(cls: Type['Model'], obj: Any):
        if hasattr(obj, "product_image") and isinstance(obj.product_image, str):
            obj.product_image = obj.product_image.split(",")

        return super().from_orm(obj)

【讨论】:

  • 收到此错误Shop_page.from_orm() missing 1 required positional argument: 'obj' (type=type_error)
【解决方案2】:

这就是validators 的用途。但是你需要按照你的方式定义模式实际上想要它,而不是您从 ORM 接收它的方式。这意味着 product_image 应该被注释为 list[str] 并且你的验证器 pre=True 将处理这种情况,如果你尝试用一个字符串来初始化它:

from pydantic import BaseModel, validator


class ShopPage(BaseModel):
    product_title: str
    product_image: list[str]

    class Config:
        orm_mode = True

    @validator("product_image", pre=True)
    def split_urls(cls, v: object) -> object:
        if isinstance(v, str):
            return v.split(",")
        return v


if __name__ == "__main__":
    class TestORM:
        product_title = "foo"
        product_image = "bar,baz"

    obj = ShopPage.from_orm(TestORM)
    print(obj.json(indent=2))

输出:

{
  "product_title": "foo",
  "product_image": [
    "bar",
    "baz"
  ]
}

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 2023-03-13
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2020-06-07
    相关资源
    最近更新 更多