访问器与修改器
大约 1 分钟
访问器与修改器
Sea-ORM 不内置“访问器/修改器”语法糖(如自动 Getter/Setter 转换)。推荐实践:
- 访问器:在 Model/VO 上实现方法或
From<T>
映射 - 修改器:在 Service 层做参数标准化/校验;在
ActiveModelBehavior::before_save
进行落库前处理 - 枚举/类型转换:用
DeriveActiveEnum
与serde
实现
访问器:Model 方法/VO 计算属性
impl entity::sys_user::Model {
pub fn display_name(&self) -> String {
self.real_name.clone().unwrap_or_else(|| self.username.clone())
}
}
#[derive(serde::Serialize)]
struct UserVO {
id: i64,
name: String,
}
impl From<entity::sys_user::Model> for UserVO {
fn from(m: entity::sys_user::Model) -> Self {
Self { id: m.id, name: m.display_name() }
}
}
修改器:写入前标准化
- 去空格、大小写统一、默认值填充、敏感字段处理
impl sea_orm::ActiveModelBehavior for entity::sys_user::ActiveModel {
fn before_save(mut self, insert: bool) -> Result<Self, sea_orm::DbErr> {
if let sea_orm::ActiveValue::Set(ref mut name) = self.username {
*name = name.trim().to_string();
}
Ok(self)
}
}
枚举映射(ActiveEnum)
见“类型转换”章节。通过 enum 声明,数据库存储 string/int,Rust 端强类型。
序列化自定义(访问器配合)
- 使用
serde
的 getter 模式:定义 VO 字段并在From
/impl
中填充 - 时间戳、掩码等展示逻辑放在 VO 层,不污染底层 Model
密码/机密字段
- 密码哈希在 Service 层处理,不在 ActiveModel 自动处理(避免误触发)
- 机密字段在响应中应
#[serde(skip_serializing)]
或不进入 VO