标签:多表 FastAPI db item user 三十四 items True id
之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计。
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)
我们测试下返回
我们已经实现了简单的多表查询。
文章首发在公众号,欢迎关注。
标签:多表,FastAPI,db,item,user,三十四,items,True,id 来源: https://www.cnblogs.com/leiziv5/p/15416797.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。