1、具有子类型的 List 字段

  但是 Python 有一种特定的方法来声明具有子类型的列表:

  从 typing 导入 List

  首先,从 Python 的标准库 typing 模块中导入 List:

  from typing import List, Optional

  from fastapi import FastAPI

  from pydantic import BaseModel

  app = FastAPI()

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: List[str] = []

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  2、声明具有子类型的 List

  要声明具有子类型的类型,例如 list、dict、tuple:

  从 typing 模块导入它们,使用方括号 [ 和 ] 将子类型作为「类型参数」传入.

  from typing import List

  my_list: List[str]

  这完全是用于类型声明的标准 Python 语法。

  对具有子类型的模型属性也使用相同的标准语法。

  因此,在我们的示例中,我们可以将 tags 明确地指定为一个「字符串列表」:

  from typing import List, Optional

  from fastapi import FastAPI

  from pydantic import BaseModel

  app = FastAPI()

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: List[str] = []

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  3、Set 类型

  但是随后我们考虑了一下,意识到标签不应该重复,它们很大可能会是唯一的字符串。

  Python 具有一种特殊的数据类型来保存一组唯一的元素,即 set。

  然后我们可以导入 Set 并将 tag 声明为一个由 str 组成的 set:

  from typing import Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel

  app = FastAPI()

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = set()

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  这样,即使你收到带有重复数据的请求,这些数据也会被转换为一组唯一项。

  而且,每当你输出该数据时,即使源数据有重复,它们也将作为一组唯一项输出。

  并且还会被相应地标注 / 记录文档。

  4、嵌套模型

  Pydantic 模型的每个属性都具有类型。但是这个类型本身可以是另一个 Pydantic 模型。因此,你可以声明拥有特定属性名称、类型和校验的深度嵌套的 JSON 对象。上述这些都可以任意的嵌套。

  - 定义子模型

  例如,我们可以定义一个 Image 模型:

  from typing import Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel

  app = FastAPI()

  class Image(BaseModel):

  url: str

  name: str

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = []

  image: Optional[Image] = None

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  5、将子模型用作类型

  然后我们可以将其用作一个属性的类型:

  from typing import Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel

  app = FastAPI()

  class Image(BaseModel):

  url: str

  name: str

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = []

  image: Optional[Image] = None

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  这意味着 FastAPI 将期望类似于以下内容的请求体:

  {

  "name": "Foo",

  "description": "The pretender",

  "price": 42.0,

  "tax": 3.2,

  "tags": ["rock", "metal", "bar"],

  "image": {

  "url": "http://example.com/baz.jpg",

  "name": "The Foo live"

  }

  }

  6、特殊的类型和校验

  除了普通的单一值类型(如 str、int、float 等)外,你还可以使用从 str 继承的更复杂的单

  一值类型。

  要了解所有的可用选项,请查看关于 来自 Pydantic 的外部类型 的文档。你将在下一章节中看到一些示例。

  例如,在 Image 模型中我们有一个 url 字段,我们可以把它声明为 Pydantic 的 HttpUrl,而不是 str:

  from typing import Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel, HttpUrl

  app = FastAPI()

  class Image(BaseModel):

  url: HttpUrl

  name: str

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = set()

  image: Optional[Image] = None

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results大连做人流哪里好 http://www.dl-fkw.com/

  该字符串将被检查是否为有效的 URL,并在 JSON Schema / OpenAPI 文档中进行记录。

  7、带有一组子模型的属性

  你还可以将 Pydantic 模型用作 list、set 等的子类型:

  from typing import List, Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel, HttpUrl

  app = FastAPI()

  class Image(BaseModel):

  url: HttpUrl

  name: str

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = set()

  images: Optional[List[Image]] = None

  @app.put("/items/{item_id}")

  async def update_item(item_id: int, item: Item):

  results = {"item_id": item_id, "item": item}

  return results

  这将期望(转换,校验,记录文档等)下面这样的 JSON 请求体:

  {

  "name": "Foo",

  "description": "The pretender",

  "price": 42.0,

  "tax": 3.2,

  "tags": [

  "rock",

  "metal",

  "bar"

  ],

  "images": [

  {

  "url": "http://example.com/baz.jpg",

  "name": "The Foo live"

  },

  {

  "url": "http://example.com/dave.jpg",

  "name": "The Baz"

  }

  ]

  }

  8、深度嵌套模型,你可以定义任意深度的嵌套模型:

  from typing import List, Optional, Set

  from fastapi import FastAPI

  from pydantic import BaseModel, HttpUrl

  app = FastAPI()

  class Image(BaseModel):

  url: HttpUrl

  name: str

  class Item(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  tax: Optional[float] = None

  tags: Set[str] = set()

  images: Optional[List[Image]] = None

  class Offer(BaseModel):

  name: str

  description: Optional[str] = None

  price: float

  items: List[Item]

  @app.post("/offers/")

  async def create_offer(offer: Offer):

  return offer

  9、任意 dict 构成的请求体

  你也可以将请求体声明为使用某类型的键和其他类型值的 dict。无需事先知道有效的字段/属性(在使用 Pydantic 模型的场景)名称是什么。如果你想接收一些尚且未知的键,这将很有用。

  其他有用的场景是当你想要接收其他类型的键时,例如 int。这也是我们在接下来将看到的。

  在下面的例子中,你将接受任意键为 int 类型并且值为 float 类型的 dict:

  from typing import Dict

  from fastapi import FastAPI

  app = FastAPI()

  @app.post("/index-weights/")

  async def create_index_weights(weights: Dict[int, float]):

  return weights

  Tip

  请记住 JSON 仅支持将 str 作为键。

  但是 Pydantic 具有自动转换数据的功能。

  这意味着,即使你的 API客户端只能将字符串作为键发送,只要这些字符串内容仅包含整数,Pydantic 就会对其进行转换并校验。 然后你接收的名为 weights 的 dict 实际上将具有 int 类型的键和 float 类型的值。

©著作权归作者所有:来自51CTO博客作者ckllf的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 什么是整型类型?Python整型详细介绍
  2. 深度学习技术在美图个性化推荐的应用实践
  3. 小诺奖得主3年后又成美国艺术与科学院士, 10年耗在博士JMP上竟奠
  4. 推荐系统中模型训练及使用流程的标准化
  5. 京东电商推荐系统实践
  6. 软件开发人员学习ML:是不是本末倒置了?
  7. 「回顾」Yoo视频底层页推荐系统从0到1的实践
  8. SumSwap含着数学金钥匙出生,独创SUM经济模型
  9. 选择模型真用对了吗? 扒一扒75篇顶级外刊的真相, 并献上最权威的

随机推荐

  1. Linux Device和Driver注册过程,以及Probe
  2. MySQL备份与还原(一)
  3. Linux安装SVN服务器
  4. linux文件目录权限和系统基础优化命令
  5. 如何卸载内核代码中的文件系统
  6. 我的电脑认为有符号整数比-1小?
  7. Linux服务器权限管理实践——添加用户只
  8. 《深入理解Linux网络技术内幕》阅读笔记(
  9. Linux Tcp/ip UDP基本概念(6.8)
  10. Codeigniter2.25部署Linux(php5.6)