是否使用FastAPI将嵌套架构插入数据库? [英] Insert a nested schema into a database with fastAPI?

查看:0
本文介绍了是否使用FastAPI将嵌套架构插入数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近了解了fast API,并阅读了教程和其他文档。尽管FastAPI有很好的文档记录,但我找不到有关在使用数据库时如何处理嵌套输入的信息。

为了测试,我编写了一个非常小的家族API,有两个模型:

class Member(Base):
    __tablename__ = 'members'

    id = Column(Integer, primary_key=True, server_default=text("nextval('members_id_seq'::regclass)"))
    name = Column(String(128), nullable=False)
    age = Column(Integer, nullable=True)
    family_id = Column(Integer, ForeignKey('families.id', deferrable=True, initially='DEFERRED'), nullable=False, index=True)

    family = relationship("Family", back_populates="members")


class Family(Base):
    __tablename__ = 'families'

    id = Column(Integer, primary_key=True, server_default=text("nextval('families_id_seq'::regclass)"))
    family_name = Column(String(128), nullable=False)

    members = relationship("Member", back_populates="family")

并且我创建了一个postgres数据库,其中包含两个表和这里描述的关系。使用模式定义和FastAPI教程中的CRUD文件,我可以创建各个族和成员,并使用GET请求以嵌套的方式查看它们。以下是嵌套架构:

class Family(FamilyBase):
    id: int
    members: List[Member]

    class Config:
        orm_mode = True

到目前为止,一切顺利。现在,我想添加一个POST视图,它接受嵌套结构作为输入并相应地填充数据库。https://fastapi.tiangolo.com/tutorial/body-nested-models/上的文档显示了原则上如何执行此操作,但它遗漏了数据库(即CRUD)部分。

由于输入没有id字段,而且显然不需要指定family_id,所以我有一个MemberStub架构和NestedFamilyCreate架构,如下所示:

class MemberStub(BaseModel):
    name: str
    age: int

class NestedFamilyCreate(BaseModel):
    family_name: str
    members: List[MemberStub]

在我的传送例程families.py中,我有:

@app.post('/nested-families/', response_model=schemas.Family)
def create_family(family: schemas.NestedFamilyCreate, db: Session = Depends(get_db)):
    # no check for previous existence as names can be duplicates
    return crud.create_nested_family(db=db, family=family)

(RESPONSE_MODEL指向包含所有ID的所有成员的族的嵌套视图;请参见上文)。

我搞不懂的是如何编写crud.create_nested_family例程。基于本教程中的简单创建,如下所示:

def create_nested_family(db: Session, family: schemas.NestedFamilyCreate):
    # split information in family and members
    members = family.members
    core_family = None # ??? This is where I get stuck
    db_family = models.Family(**family.dict())  # This fails
    db.add(db_family)
    db.commit()
    db.refresh(db_family)
    return db_family
因此,我可以提取成员并遍历它们,但我首先需要创建一个不能包含成员的新db_family记录。然后,使用db.refresh,我将获得新的Family_id,我可以将其添加到members的每个记录中。但我怎么能做到这一点呢?如果我理解这里所需要的内容,我将需要实现将我的嵌套模式映射到FamilyCreate的普通模式(它自己工作)和MemberCreate的普通模式(它也自己工作)。但我如何才能做到这一点?

推荐答案

我在重新阅读有关PYDANIC模型及其到DICT的映射后找到了解决方案。

在crud.py中:

def create_nested_family(db: Session, family: schemas.NestedFamilyCreate):
    # split information in family and members
    family_data = family.dict()
    member_data = family_data.pop('members', None)   # ToDo: handle error if no members
    db_family = models.Family(**family_data)
    db.add(db_family)
    db.commit()
    db.refresh(db_family)
    # get family_id
    family_id = db_family.id
    # add members
    for m in member_data:
        m['family_id'] = family_id
        db_member = models.Member(**m)
        db.add(db_member)
        db.commit()
        db.refresh(db_member)
    return db_family

希望,这可能对其他人有用。

这篇关于是否使用FastAPI将嵌套架构插入数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆