之前我們分享的是基于單個的資料庫表的操作,我們在設計資料庫的時候也設計了跨表,我們可以看下資料庫的設計,
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)
我們測驗下回傳

我們已經實作了簡單的多表查詢,
文章首發在公眾號,歡迎關注,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325312.html
標籤:其他
下一篇:Mysql安裝教程
