用途:指导 Django Admin 的定制开发,重点在保存钩子、内联 formset、查询优化、索引与安全边界。
主要能力:
- 保存钩子。save_model 先于 save_formset 执行,父对象保存后可安全引用 parent.pk。save_formset 的 changed_objects 形如 [(obj, {field: old_value})],new_objects 为 [(obj,)],deleted_objects 为 [obj, ...],三种结构不同,需按真实结构处理与测试。
- 查询集优化。在 get_queryset 中用 select_related 处理外键、prefetch_related 处理多对多与反向外键;避免在 list_display 方法中使用 .count() 造成 N+1,改用 annotate(Count(...)) 或用 Prefetch 配合 to_attr 做复杂聚合。
- 索引策略。对用于 list_filter、search_fields 或 API 过滤的 CharField、状态字段、日期范围字段添加 db_index,必要时用 Meta.indexes 建复合索引,遵循最左前缀规则。
- 安全与权限。get_search_results 的自定义搜索逻辑需校验字段,避免任意字段访问;用 get_formset 按用户角色过滤内联子对象查询集,防止数据泄漏。
- 审计。可在 save_formset 中捕获 changed/new/deleted 三类对象并写入审计日志,保存成功后再记录。
使用方式:以 ModelAdmin 子类方法定制为主,例如重写 save_model、save_formset、get_queryset、get_formset;性能可用 assertNumQueries 做回归测试。
适用场景:需要扩展后台数据管理、内联编辑、按角色限制可见数据、优化后台列表性能的项目。
限制:资料未提供具体安装命令、版本要求、价格与授权信息;Admin 定制涉及授权边界,完整安全模式(CSRF、认证、权限)需参考主 Django 技能资料。