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:
@ -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
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user