使用 Next.js + FastAPI 建構表單資料轉換器(Mapper)模組
在實務專案中,前端表單往往由多層巢狀的資料組成,例如使用者輸入的一系列目標設定、報告項目、子任務等。但後端通常需要儲存成平坦化的資料表(例如:一張批次表、一張細項表、一張子細項表)。
為了解決前端與後端資料格式不一致的問題,我們可以設計一個 Mapper 模組,作為兩端資料結構之間的轉譯橋梁。
🧰 系統架構概覽
- 前端:使用 Next.js + React Hook Form 建構表單
- 後端:使用 FastAPI 作為 RESTful API 框架
- 資料庫:PostgreSQL,使用多張關聯表設計
📌 範例情境:多層表單資料送出
假設你要送出一份多層結構的「使用者目標設定表單」:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "category_id": 3, "year": 2024, "owner": "Alice", "items": [ { "name": "任務 A", "value": 100, "sub_items": [ { "label": "子任務 A1", "score": 30 }, { "label": "子任務 A2", "score": 70 } ] } ] }
|
後端需要將資料拆解後分別寫入:
goal_batches 表(紀錄批次)
goal_items 表(每個任務)
goal_sub_items 表(任務下的子任務)
🔧 Mapper 設計
撰寫一個通用的 map_goal_payload() 函式,協助拆解 JSON 結構:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def map_goal_payload(payload: dict) -> dict: batch_data = { "category_id": payload["category_id"], "year": payload["year"], "owner": payload["owner"] }
items_data = [] for item in payload["items"]: item_data = { "name": item["name"], "value": item["value"], "sub_items": item.get("sub_items", []) } items_data.append(item_data)
return { "batch": batch_data, "items": items_data }
|
💡 實際應用 in FastAPI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @router.post("/goals/submit") def submit_goals(payload: dict, db: Session = Depends(get_db)): mapped = map_goal_payload(payload)
batch = GoalBatch(**mapped["batch"]) db.add(batch) db.flush()
for item in mapped["items"]: goal_item = GoalItem(batch_id=batch.id, name=item["name"], value=item["value"]) db.add(goal_item) db.flush()
for sub in item["sub_items"]: sub_item = GoalSubItem(item_id=goal_item.id, **sub) db.add(sub_item)
db.commit() return {"message": "成功建立目標紀錄"}
|
🧪 搭配 Pydantic 型別驗證
定義清楚的 Schema 可提升開發效率與資料安全性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class SubItemSchema(BaseModel): label: str score: int
class GoalItemSchema(BaseModel): name: str value: int sub_items: List[SubItemSchema]
class GoalBatchSchema(BaseModel): category_id: int year: int owner: str items: List[GoalItemSchema]
|
🔍 結語:將前端巢狀資料結構轉換為後端關聯資料的利器
透過 Mapper 設計:
- ✅ 將複雜表單結構轉成簡潔平坦格式
- ✅ 降低後端邏輯耦合,方便重用與測試
- ✅ 對應前端 JSON 結構變化,只需更新 mapping 規則即可
這種設計特別適合複雜業務系統、ERP、CRM、內部管理後台等場景。