当前位置: 首页 > 知识库问答 >
问题:

在FastAPI(Pydantic)中展平或重新映射模型

谷梁嘉悦
2023-03-14

我在FastAPI中设置了一个简单的API。所以在我的例子中,我有一个用户表和一个项目表。每个用户都可以被分配到多个项目。没有限制。这意味着,两个表都通过多对多字段链接在一起。

当我打印出所有用户时,它将显示如下:

[
  {
    "id": 1,
    "username": "test1",
    "articles": [
      {
        "id": 1,
        "title": "foo",
      },
      {
        "id": 2,
        "title": "bar",
      }
    ],
  },
  {
    "id": 2,
    "username": "test2",
    "articles": [
      {
        "id": 1,
        "title": "foo",
      },
    ],
  },
]

但是我希望将articles属性展平。只有文章的ID应该是可见的,周围没有不需要的字典。

应该是这样的:

[
  {
    "id": 1,
    "username": "test1",
    "articles": [
      1,
      2,
    ],
  },
  {
    "id": 2,
    "username": "test2",
    "articles": [
      1,
    ],
  },
]

模式。py:

class ArticleBase(BaseModel):
    id: int
    title: str

class UserBase(BaseModel):
    id: int
    username: str
    articles: List[ArticleBase]

主要的py:

@app.get("/users/", response_model=List[schemas.UserBase])
def get_users(db: Session = Depends(crud.get_db)):
    return crud.get_users(db)

积垢。py:

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

def get_users(db: Session):
    return db.query(models.User).all()

models.py:

user_article_assoc = Table('user_article_assoc', Base.metadata,
                   Column('user_id', Integer, ForeignKey('user.id')),
                   Column('article_id', Integer, ForeignKey('article.id')))

class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String)
    articles = relationship("Article", secondary=user_article_assoc, backref="users")

class Article(Base):
    __tablename__ = "article"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)

共有1个答案

徐德海
2023-03-14

这段代码将把你的用户整理成一个字典列表,你可以很容易地修改它来转换成其他模型:

flatternedUsers = list(map(lambda u: { 'id' :u.id, 'username': u.username, 'articles': list(map(operator.attrgetter('id'), u.articles)) }, users))

您还可以为此使用对象映射器库,例如对象映射器或odin。对象-对象映射器的好处是,如果您的用户现在有一个新属性,例如生日,它将自动映射到您想要返回的扁平化用户模型中的相同属性,假设您没有忘记添加生日归因于他们。

 类似资料:
  • 我有一个 FastAPI 项目,其中一个endpoint如下所示: 如您所见,我的响应是任意属性dict,其格式为的属性是采购订单ID。我如何编写来表示我的响应?因此,我希望大摇大摆地展示我的回应。

  • 问题内容: 我是Elasticsearch的新手,目前正在实现用于搜索的过滤器。到目前为止,我的索引具有以下映射(我已经删除了一些字段): geo_distance字段将在location字段上实现,示例实例如下所示: 即采用geoJSON格式。 我了解我将必须更新索引,以使location字段的类型为,如文档(mapping-geo- point )中所述。似乎我必须删除索引并创建一个新索引,但

  • 我正在构建一个FastAPI应用程序,它有很多Pydantic模型。尽管应用程序运行良好,但正如所料,OpenAPI (Swagger UI)文档并没有在< code>Schemas部分显示所有这些模型的模式。 下面是pydantic<code>模式的内容。py</code> 所有这些模型实际上都在FastAPI路径中用于验证请求体。< code>FaultQueryParams是一个自定义模型,

  • 问题内容: 给定一个,其中值是a 或另一个,那么如何使用Java 8将地图展平到单个值列表? 例: 对于上面的示例,我想要以下列表: 我知道可以这样做: 我该如何使用? 编辑: 经过一番游戏后,我发现了: 问题答案: 您可以定义一个递归方法来展平一个地图并将其用作函数或直接调用它来使用。 例: 对于给定的嵌套地图,它会打印 [value1,value2,value3.1,value3.2,valu

  • 我想在没有ORM的情况下使用FastAPI(使用asyncpg),并将select查询返回的值映射到pydantic模型。通过这种方式,使用pydantic验证返回的值,并且返回的响应的结构类似pydanti模型/模式。 我尝试寻找有关此的文档,但很难找到/不清楚。我将不胜感激任何帮助!

  • 在FastAPI中,我使用了SQLAlchemy和Pydanic返回数据 这种方式可以帮助我规范化返回的模型,但是我想要将所有api统一返回格式为{"code":0,"msg":"success","data":{...}},使原本返回模型中User的模型置于data中,方便前端管理。 我尝试了使用FastAPI中间件来实现,但是在swagger等文档中无法识别返回模型User;如果重新定义一个通

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 我想创建一个FastAPIendpoint,它只接受任意发布请求正文并返回它。 如果我发送,我想得到。但我也希望能够发送并取回它。 我试过了: 但是无论我发送什么,这都会返回一个空字典。 有什么想法吗?