Open12
FastAPIを勉強する
FastAPIに入門する
Schemaについて
再帰的な型定義クラスが書けない。
from pydantic import BaseModel
class Item(BaseModel):
id: int
name: str
# クラス内で自身を使用できない。クラス変数なので`self`も使用できない。
children: list[Item] = [] # NameError: name 'Item' is not defined
以下のように、クラス名をクォーテーションで囲んで文字列にする[1][2]ことで解決できる。
from pydantic import BaseModel
class Item(BaseModel):
id: int
name: str
- # クラス内で自身を使用できない。クラス変数なので`self`も使用できない。
- children: list[Item] = [] # NameError: name 'Item' is not defined
+ children: list["Item"] = []
main.py
で受け取る型とcrud.py
で受け取る型が異なる場合[1]はどのように型を定義するべきか?
例えば以下の場合だと、アイテムを登録するユーザーのIDを自動で入れたいため型の定義が変わってしまう。
schemas.py
from pydantic import BaseModel
ItemMainCreate(BaseModel):
name: str
ItemCrudCreate(BaseModel):
name: str
owner_id: str
ItemCrudCreate
のowner_id
をオプショナルにする方法が考えられるが、値が絶対に上書きされてしまうowner_id
が存在するのは気持ち悪い。
以下のようにcrud.py
でowner_id
を別途引数として受け取る手もあるが、項目が増えると煩雑になってしまう。
crud.py
def create_item(item: schemas.ItemMainCreate, owner_id: int):
return {**item.dict(), "owner_id": owner_id}
今のところ項目が増える予定はないので後者の方法で実装している。
項目が増えたらそのとき考えればいいや。
htmlコンテンツ?を受け取れない
音声を上手く受け取れなかった
ユーザー認証について
CRUDについて
FastAPIのドキュメントに記載されている[1]ように、スキーマの値は次のようにDBモデルに代入すると楽。
crud.py
def create_item(db: Session, item: schemas.ItemCreate):
db_item = models.Item(**item.dict())
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
FastAPIのドキュメントには(たぶん)記載されていないが、DBモデルを更新するときには辞書のupdate
[2]を使うと楽。
できませんでした。誰かこんな感じのやり方教えて。
crud.py
def update_item(db: Session, item_id: int, item: schemas.ItemCreate):
db_item = get_user(db=db, item_id=item_id)
db_item.update(**item.dict())
db.commit()
db.refresh(db_item)
return db_item