FastAPI 学习之路(三十四)数据库多表操作

 

        之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计。

        

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, index=True)
    hashed_password = Column(String)
    is_active = Column(Boolean, default=True)
    items = relationship("Item", back_populates="owner")

class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    owner_id = Column(Integer, ForeignKey("users.id"))
    owner = relationship("User", back_populates="items")

  那么我们看下这对应的 pydantic模型如何进行创建。

class ItemBase(BaseModel):
    title: str
    description: Optional[str] = None


class ItemCreate(ItemBase):
    pass


class Items(ItemBase):
    id: int
    owner_id: int

    class Config:
        orm_mode = True

        其实这里没有什么特别的,都是一些简单的配置。但是我们需要更新下用的pydantic模型

        

from pydantic import BaseModel
from typing import List,Optional
class Users(UserBase):
    """
    响应模型:
    id:email: is_active并且设置orm_mode与之兼容
    """
    id: int
    is_active: bool
    items: List[Items] = []
    class Config:
        orm_mode = True

    增加对于items的适配。我们在操作数据库的地方也需要进行改造。

def get_item(db: Session, skip: int = 0, limit: int = 100):
    return db.query(Item).offset(skip).limit(limit).all()


# 新建用户的item
def create_user_item(db: Session, item: ItemCreate, user_id: int):
    db_item = Item(**item.dict(), owner_id=user_id)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

我们去增加两个接口,一个接口是创建item 一个是获取item

#  所有item
@app.get("/items/", response_model=List[Items])
def read_items(skip: int = 0, limit: int = 0, db: Session = Depends(get_db)):
    items = get_item(db=db, skip=skip, limit=limit)
    return items


# 创建用户的item
@app.post("/users/{user_id}/items", response_model=Items)
def create_item_user(user_id: int, item: ItemCreate, db: Session = Depends(get_db)):
    return create_user_item(db=db, item=item, user_id=user_id)

   我们去调试下。

 

 

我们去查询下所有的items

 

 

  我们去开发一个接口,如何查询用户的items。

#封装操作数据库
def get_user_item(db:Session,userid:int):
    user=db.query(User).filter(User.id==userid).first()
    return  db.query(Item).filter(Item.owner==user).offset(1).limit(1).all()
#封装接口
@app.post("/user/item/{user_id}",response_model=List[Items])
def get_user_items(user_id:int,db:Session=Depends(get_db)):
    return get_user_item(db=db,userid=user_id)

我们测试下返回

 

 我们已经实现了简单的多表查询。

文章首发在公众号,欢迎关注。

posted @ 2021-10-20 06:00  北漂的雷子  阅读(1582)  评论(0编辑  收藏  举报