data/products.py)をそのまま使ってPOSTを実装する4では、商品データを data/products.py に切り出してGETで取得しました。
5では同じ data/products.py を使い、**POSTで商品データを追加(作成)**してみます。
create_productという商品データ作成用の関数を追加します
data/products.py
# data/products.py
# 今回は「DBの代わり」に Python の辞書でデータを保持します
PRODUCTS = {
1: {"id": 1, "name": "Apple", "price": 120, "stock": 30},
2: {"id": 2, "name": "Banana", "price": 80, "stock": 12},
3: {"id": 3, "name": "Orange", "price": 150, "stock": 0},
}
def get_product(product_id: int):
return PRODUCTS.get(product_id)
def list_products():
return list(PRODUCTS.values())
def create_product(name: str, price: int, stock: int):
# id を採番(最大id + 1)
next_id = max(PRODUCTS.keys()) + 1 if PRODUCTS else 1
new_product = {"id": next_id, "name": name, "price": price, "stock": stock}
PRODUCTS[next_id] = new_product
return new_product
POSTでは「idはサーバ側で採番」したいので、
リクエストでは id を受け取らず、name / price / stock のみ受け取る形にします。
main.py
from pydantic import BaseModel
class ProductCreate(BaseModel):
name: str
price: int
stock: int
data/products.py の create_product() を呼び出して新しい商品を作成します。
main.py
from fastapi import FastAPI
from data.products import create_product
app = FastAPI()
@app.post("/products/", status_code=201)
def create_product_api(product: ProductCreate):
new_product = create_product(
name=product.name,
price=product.price,
stock=product.stock,
)
return {
"message": "Product created",
"product": new_product,
}