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