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
from datetime import datetime
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}
@field_validator("images", mode="before")
@classmethod
def model_validate(cls, obj, **kwargs):
"""处理 DB 中 images 的 JSON 字符串 → list 反序列化"""
def _parse_images(cls, v):
"""处理 DB 中 images 的 JSON 字符串 → list 反序列化(不污染 ORM 对象)"""
import json
if hasattr(obj, "images") and isinstance(obj.images, str):
if isinstance(v, str):
try:
obj.images = json.loads(obj.images)
return json.loads(v)
except (json.JSONDecodeError, TypeError):
obj.images = []
elif hasattr(obj, "images") and obj.images is None:
obj.images = []
return super().model_validate(obj, **kwargs)
return []
if v is None:
return []
return v
# ============================================================