4で作ったデータファイル(data/products.py)をそのまま使ってPOSTを実装する

4では、商品データを data/products.py に切り出してGETで取得しました。

5では同じ data/products.py を使い、**POSTで商品データを追加(作成)**してみます。


1. data/products.py に「追加用の関数」を追加する

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

2. Pydanticモデル(POSTで受け取る形)を作成する

POSTでは「idはサーバ側で採番」したいので、

リクエストでは id を受け取らず、name / price / stock のみ受け取る形にします。

main.py

from pydantic import BaseModel

class ProductCreate(BaseModel):
    name: str
    price: int
    stock: int

3. POSTエンドポイントを作成する(4のファイルに追加する)

data/products.pycreate_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,
    }