From a77a98c93e64f90189e3f1aacd202cd45cbd3389 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 14 Aug 2026 21:59:19 +0800 Subject: [PATCH] =?utf8?q?fix:=20sync/push=20422=20=E2=80=94=20group=5Fid?= =?utf8?q?=20=E6=8E=A5=E5=8F=97=20int/str=20=E5=B9=B6=E5=BD=92=E4=B8=80?= =?utf8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit iPad 离线学习后恢复连线同步失败,根因为前端 IndexedDB 以 int 存储 group_id,而 Pydantic 模型声明为 str,导致 /api/sync/push 返回 422。将 ProgressUpdate/SyncEvent 的 group_id 改为 Union[str, int] 并加 field_validator 在校验前转 str,修复上传。 --- backend/main.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/backend/main.py b/backend/main.py index c027419..f4b5e9c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -6,8 +6,8 @@ import datetime import urllib.request import urllib.parse import urllib.error -from pydantic import BaseModel -from typing import List, Optional +from pydantic import BaseModel, field_validator +from typing import List, Optional, Union app = FastAPI() @@ -54,14 +54,24 @@ class WordData(BaseModel): from_attributes = True class ProgressUpdate(BaseModel): - group_id: str + group_id: Union[str, int] op_type: str + @field_validator('group_id', mode='before') + @classmethod + def coerce_group_id(cls, v): + return str(v) + class SyncEvent(BaseModel): - group_id: str + group_id: Union[str, int] op_type: str completed_at: str + @field_validator('group_id', mode='before') + @classmethod + def coerce_group_id(cls, v): + return str(v) + class SyncPushRequest(BaseModel): events: List[SyncEvent] -- 2.43.0