Commit cbd3da78 authored by uuo00_n's avatar uuo00_n

refactor(models): 更新Pydantic模型配置以兼容v2版本

将Config类替换为model_config,使用ConfigDict配置模型
添加field_serializer处理ObjectId序列化
更新PyObjectId验证器以兼容Pydantic v2
parent 47111225
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, ConfigDict, field_serializer
from bson import ObjectId
from app.models.user import PyObjectId
......@@ -12,9 +12,9 @@ class MessageModel(BaseModel):
contains_sensitive_words: bool = False
sensitive_words_found: List[str] = []
class Config:
arbitrary_types_allowed = True
json_encoders = {ObjectId: str}
model_config = ConfigDict(
arbitrary_types_allowed=True,
)
# 对话模型
class ConversationModel(BaseModel):
......@@ -24,7 +24,11 @@ class ConversationModel(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
class Config:
allow_population_by_field_name = True
arbitrary_types_allowed = True
json_encoders = {ObjectId: str}
\ No newline at end of file
model_config = ConfigDict(
populate_by_name=True,
arbitrary_types_allowed=True,
)
@field_serializer("id", when_used="json")
def serialize_id(self, v: ObjectId):
return str(v)
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, ConfigDict, field_serializer
from bson import ObjectId
from app.models.user import PyObjectId
......@@ -42,10 +42,14 @@ class SensitiveWordModel(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
class Config:
allow_population_by_field_name = True
arbitrary_types_allowed = True
json_encoders = {ObjectId: str}
model_config = ConfigDict(
populate_by_name=True,
arbitrary_types_allowed=True,
)
@field_serializer("id", when_used="json")
def serialize_id(self, v: ObjectId):
return str(v)
# 敏感词详细信息
class SensitiveWordInfo(BaseModel):
......@@ -64,7 +68,19 @@ class SensitiveRecordModel(BaseModel):
highest_severity: int = 1 # 记录中最高的严重程度
timestamp: datetime = Field(default_factory=datetime.now)
class Config:
allow_population_by_field_name = True
arbitrary_types_allowed = True
json_encoders = {ObjectId: str}
\ No newline at end of file
model_config = ConfigDict(
populate_by_name=True,
arbitrary_types_allowed=True,
)
@field_serializer("id", when_used="json")
def serialize_id(self, v: ObjectId):
return str(v)
@field_serializer("user_id", when_used="json")
def serialize_user_id(self, v: ObjectId):
return str(v)
@field_serializer("conversation_id", when_used="json")
def serialize_conversation_id(self, v: ObjectId):
return str(v)
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, ConfigDict, field_serializer
from bson import ObjectId
from pydantic_core import core_schema
# 自定义ObjectId字段
class PyObjectId(ObjectId):
@classmethod
def __get_validators__(cls):
# Pydantic v2 仍支持生成器形式的验证器
yield cls.validate
@classmethod
def validate(cls, v):
# 校验传入的值是否是合法的 ObjectId 字符串
if not ObjectId.is_valid(v):
def __get_pydantic_core_schema__(cls, source_type, handler):
def validate(v):
if isinstance(v, ObjectId):
return v
if ObjectId.is_valid(v):
return ObjectId(v)
raise ValueError("无效的ObjectId")
return ObjectId(v)
return core_schema.no_info_plain_validator_function(validate)
# Pydantic v2 中不再支持 __modify_schema__;如需自定义
# JSON Schema,可实现 __get_pydantic_json_schema__。当前
# 版本先保持默认 Schema,以确保运行稳定。
@classmethod
def __get_pydantic_json_schema__(cls, core_schema_, handler):
json_schema = handler(core_schema_)
json_schema.update({"type": "string"})
return json_schema
# 用户模型(修复缩进错误:确保为顶层类定义)
......@@ -42,15 +43,10 @@ class UserModel(BaseModel):
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
class Config:
# 允许使用字段名进行赋值(即使定义了 alias)
allow_population_by_field_name = True
# 允许使用自定义类型(如 ObjectId)
arbitrary_types_allowed = True
# 将 ObjectId 序列化为字符串,便于前端展示
json_encoders = {ObjectId: str}
# 示例数据,便于接口文档和调试
schema_extra = {
model_config = ConfigDict(
populate_by_name=True,
arbitrary_types_allowed=True,
json_schema_extra={
"example": {
"username": "user1",
"email": "user1@example.com",
......@@ -59,4 +55,9 @@ class UserModel(BaseModel):
"role_level": 1,
"edition": "edu",
}
}
\ No newline at end of file
},
)
@field_serializer("id", when_used="json")
def serialize_id(self, v: ObjectId):
return str(v)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment