之前我們分享的是基於單個的數據庫表的操作,我們在設計數據庫的時候也設計了跨表,我們可以看下數據庫的設計。
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)
我們測試下返回

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

