fix: TaskRecordResponse改用field_validator — 不再污染ORM对象导致图片列表写回VARCHAR报错

根因: model_validate直接obj.images=json.loads()把ORM对象的字符串改成列表
     SQLAlchemy autoflush时把列表写回VARCHAR列 → DataError
修复: field_validator(mode=before)在序列化层转换, 不修改ORM源对象
This commit is contained in:
2026-08-13 09:03:17 +08:00
parent abc8999358
commit b8ade13b61

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import uuid import uuid
from datetime import datetime from datetime import datetime
from typing import Optional from typing import Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field, field_validator
# ============================================================ # ============================================================
@ -82,18 +82,19 @@ class TaskRecordResponse(BaseModel):
model_config = {"from_attributes": True} model_config = {"from_attributes": True}
@field_validator("images", mode="before")
@classmethod @classmethod
def model_validate(cls, obj, **kwargs): def _parse_images(cls, v):
"""处理 DB 中 images 的 JSON 字符串 → list 反序列化""" """处理 DB 中 images 的 JSON 字符串 → list 反序列化(不污染 ORM 对象)"""
import json import json
if hasattr(obj, "images") and isinstance(obj.images, str): if isinstance(v, str):
try: try:
obj.images = json.loads(obj.images) return json.loads(v)
except (json.JSONDecodeError, TypeError): except (json.JSONDecodeError, TypeError):
obj.images = [] return []
elif hasattr(obj, "images") and obj.images is None: if v is None:
obj.images = [] return []
return super().model_validate(obj, **kwargs) return v
# ============================================================ # ============================================================