Я использую SQLModel для API.
Я хочу, чтобы объект был таким:
class Post(SQLModel):
id: int
categories: list[str] # category.name
вместо вложенных объектов:
class Post(SQLModel):
id: int
categories: list[Category]
Нужно ли менять функцию сериализации или есть способ сделать это автоматически?






Насколько я понял Post это ваша модель БД. Я настоятельно рекомендую отделить вашу модель db (должна отражать структуру базы данных) от dto (следует использовать для удобной передачи данных между компонентами приложения)
class PostDTO(pydantic.BaseModel):
id: int
categories: list[str]
@classmethod
def from_db_model(cls, model: Post) -> "PostDTO":
"""Build Post DTO based on db model."""
return cls(
id=model.id,
categories=[category.name for category in model.categories]
)
post = Post(...)
post_dto = PostDTO.from_db_model(model=post)
Не бойтесь создавать дополнительный объект, если это сделает ваш код более масштабируемым, читабельным и логичным!
Не существует автоматического способа извлечения свойства из входящего объекта, подлежащего проверке. Вам нужно будет использовать field_validator, чтобы сделать это «автоматически»:
class Post(SQLModel):
id: int
categories: list[str]
@field_validator("categories")
@classmethod
def normalize_categories(cls, value, info):
return [item.name for item in value]