适配器与集成¶
在 MODELSHEET 中使用带点号的类路径指定组件,组件以无参方式实例化。
from modelsheet.adapters import SaveAdapter
from modelsheet.permissions import PermissionPolicy
class ProjectSaveAdapter(SaveAdapter):
def validate(self, instance, request):
super().validate(instance, request)
# 在此添加项目验证,可抛出 Django ValidationError。
def save(self, instance, fields, request):
instance.save()
class ProjectPolicy(PermissionPolicy):
def can_edit_object(self, request, admin, obj):
return (
super().can_edit_object(request, admin, obj)
and not getattr(obj, "is_locked", False)
)
settings.py
MODELSHEET.update({
"save_adapter": "myproject.modelsheet.ProjectSaveAdapter",
"permission_policy": "myproject.modelsheet.ProjectPolicy",
})
接口¶
| 组件 | 方法 |
|---|---|
FieldAdapter |
supported(field), editable(field), metadata(field), serialize(field, instance), parse(field, value) |
SaveAdapter |
validate(instance, request), save(instance, fields, request) |
PermissionPolicy |
can_view_field(request, admin, name), can_edit_field(request, admin, name), can_view_object(request, admin, obj), can_edit_object(request, admin, obj) |
策略在标准 Django 权限之外进一步收紧访问。租户和行范围应放在 ModelAdmin.get_queryset(),使计数与分页也受限;对象 hooks 不能替代查询筛选。
适配器不得独立提交事务、切换数据库或信任客户端字段名。默认验证调用 full_clean(),默认保存调用实例 save()。外部工作请通过 transaction.on_commit() 调度,并自行处理幂等。
字段编辑器¶
已编译 frontend 支持文本和 choices。自定义字段适配器可复用该标量契约;新 JS 控件需要修改并重新构建 frontend。默认适配器不编辑 FK/M2M。
事务与审计¶
包端点排除在 ATOMIC_REQUESTS 外,使用独立短写事务。PostgreSQL/MySQL 在比较签名指纹前锁定新读取的记录;SQLite 需要 IMMEDIATE。数据库忙或死锁返回可重试错误,应使用原请求和原键重试。
未修改字段不会从客户端赋值。默认 save() 允许项目 hooks 修改其他字段,但审计只记录显式赋值字段及其保存后值,并非完整数据库审计。
Admin 集成边界¶
继承 get_queryset、readonly_fields、权限、标量 search_fields 和普通具体字段排序。关联搜索、自定义 list filters、display 方法排序、自定义表单、save_model 与 save_related 不会自动转换。不能精确转换状态时阻止切换,而非丢弃条件。
后台扩展参见 BackgroundAdapter。