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