小编Wil*_*aly的帖子

相当于 Pydantic/FastAPI 的 Marshmallow dump_only 字段,没有多个模式

问题

是否可以dump_only使用 FastAPI 的 pydantic 复制 Marshmallow 的功能,以便某些字段是“只读”,而不需要为序列化和反序列化定义单独的模式?

语境

有时,给定 API 资源的属性子集(例如idcreated_date)应该是只读的,并且应该在反序列化期间从请求有效负载中忽略(例如,当 POST 到集合或 PUT 到现有资源时),但需要对于这些相同的请求,将在响应正文中与该架构一起返回。

Marshmallow 提供了一个方便的dump_only参数,只需要为序列化和反序列化定义一个模式,并可以选择从任一操作中排除某些字段。

现有解决方案

我见过的在 FastAPI 中复制此功能的大多数尝试(即FastAPI 文档GitHub 问题相关 SO 问题)倾向于为输入(反序列化)和输出(序列化)定义单独的模式,并为之间的共享字段定义一个通用的基本模式。他们俩。

根据我目前对这种方法的理解,由于以下几个原因,它似乎有点不方便:

  1. 它要求 API 开发人员为每个模式保留单独的命名空间,而将公共字段抽象为第三个“基”模式类的做法会加剧这个问题。
  2. 它导致具有嵌套资源的 API 中模式类的激增,因为每个级别的嵌套都需要单独的输入和输出模式。
  3. 当该 API 的使用者只需要知道单个模式时,符合 OAS 的文档将输入/输出模式显示为单独的定义,因为这些只读字段的(反)序列化应由API。

例子

假设我们正在为具有以下模型的调查开发一个简单的 API:

from sqlalchemy.orm import declarative_base, relationship
from sqlalchemy import (
    func,
    Column,
    Integer,
    String,
    DateTime,
    ForeignKey,
)

Base = declarative_base()


class SurveyModel(db.Base):
    """Table that …
Run Code Online (Sandbox Code Playgroud)

python marshmallow pydantic fastapi

5
推荐指数
1
解决办法
2899
查看次数

标签 统计

fastapi ×1

marshmallow ×1

pydantic ×1

python ×1