SuperAPI AI 工具集

django-models

编程与开发

查看项目

更新于 10-16 08:47

技能介绍

用途:这是 getsentry/sentry 仓库中用于设计 Sentry Django ORM 模型的技能,重点在架构约定而非 Django 语法、导入顺序或迁移生成。它要求写字段前先确定四个相互耦合的决策,选错其一往往需要追加迁移修正。

主要能力:

  1. 选择 silo:默认用 @cell_silo_model,仅当数据跨组织共享或需与控制面资源(认证、集成安装、API token、slug 保留)强一致时才用 @control_silo_model。判断标准是最小可用 silo,以及是否与所有修改方同处一 silo。
  2. 判断另一 silo 是否需要读取该数据:需要则继承 ReplicatedCellModel 或 ReplicatedControlModel,并设置 category: ClassVar[OutboxCategory] = OutboxCategory.MY_THING;确实不跨边界的用基础 Model。
  3. 迁移范围:每个具体模型必须设置 relocation_scope,常见为 RelocationScope.Organization(随组织迁移的客户数据)或 RelocationScope.Excluded(瞬态数据、遥测、缓存、系统内部状态、getsentry 应用内数据)。Excluded 不能属于集合。
  4. 外键的跨 silo 影响:同 silo 用 FlexibleForeignKey,会创建真实数据库约束并由 Postgres 执行级联删除;跨 silo 用 HybridCloudForeignKey,无数据库约束,级联经 outbox tombstone 最终一致,on_delete 传字符串(如 "SET_NULL"),字段名需带 _id 后缀。新代码避免裸 Django ForeignKey。

其他规范:新模型用 DefaultFieldsModel(自带 date_added/date_updated),不用旧版 DefaultFieldsModelExisting;主键用 BoundedBigAutoField,非主键数值用 BoundedBigIntegerField/BoundedPositiveIntegerField;无严格规格的文本用 CharField(max_length=256),自由文本用 TextField,新 JSON 列用 models.JSONField();可变默认值不可用裸 default={} 或 default=[];软删除需显式 status 字段配合 ObjectStatus;用 Meta.constraints 的 UniqueConstraint 替代 unique_together 以支持条件唯一;复合索引字段顺序需匹配查询过滤顺序。模型文件默认放 src/sentry/<app>/models.py 或 models/<thing>.py,src/sentry/models/ 为旧位置。

用法:设计完成后调用 generate-migration 技能生成迁移;若模型需复制,调用 hybrid-cloud-outboxes 技能配置 payload、信号接收器和删除处理;若应用 models/init.py 重导出模型,需按惯例加入新模型。文中给了一个最小 cell silo 模型骨架可作为起点。

限制:该技能不涵盖 Django 语法、导入顺序与迁移生成;Hybrid cloud RPC 需用 hybrid-cloud-rpc 技能;ParanoidModel 较重,多数模型不应使用;如不确定复制行为,应在定稿前参考 hybrid-cloud-outboxes 技能。