8.2. 标识符格式协议
资源可以通过其唯一键来识别,这些键是资源字段的元组。每个资源都可以保证将其主键号作为唯一键,但可能存在许多其他唯一的键。资源可以生成标识符格式,因此如果它至少有一个满足以下规则的唯一键,则具有命名 URL:
-
键必须只包含
name
字段或文本字段,并带有有限数量的选项(如凭证类型资源的kind
字段)。 - 唯一允许的特殊字段会破坏上述规则是与自身以外的资源相关的多对一相关字段,它也允许具有 slug。
如果有资源 Foo
和 Bar
,则 Foo
和 Bar
都包含一个 name 字段和一个 choice 字段,它只能具有 "yes" 或 "no"。此外,资源 Foo
具有一个与 Bar
相关的多对一字段(例如 fk
)。foo
具有唯一的键元组(名称
、选择
、fk
),而 Bar
具有唯一的键元组(名称
,选择
)。bar
可以具有命名 URL,因为它满足前面的第一条规则。foo 也可以具有命名 URL,即使它会破坏第一个规则,但额外的字段破坏规则号为 fk
字段,它是一个与 Bar
和 Bar
相关的许多与一对一相关的字段。
对于满足规则编号 1 的资源,其人类可读的唯一标识符组合是外键字段的组合,用 +
分隔。特别是,上例中的资源 Bar
具有 slug 格式 < name>+<choice>
;。请注意,字段顺序在 slug 格式的问题,如果存在,则名称字段始终首先出现,后跟字段名称的字典顺序排列的其余字段。例如,如果
Bar
也具有满足规则一的
字段,并且唯一键变成 (名称、选择、a_a_choice
choice
),其 slug 格式将变为 <name
>< a_choice><choice>
。
对于满足规则编号 2 的资源,如果通过额外的外键字段进行追踪,则结果是用于标识该资源对象的资源树。为了生成标识符格式,追溯树中的每个资源都会使用外键以外的所有字段生成自己的独立格式部分。最后,所有部分都由 ++
按照以下顺序合并:
- 将单机格式作为第一个标识符部分设置。
- 为每个资源递归生成唯一标识符。底层资源指向使用外键(追溯 树节点的子代)。
- 将生成的唯一标识符视为标识符组件的其余部分。按照对应外键的字典顺序对它们进行排序。
-
使用
++
组合所有组件来生成最终标识符格式。
当为资源 Foo
生成标识符格式时,自动化控制器会生成独立格式,< name>+<choice> 用于
; Foo
和 <fk.name>+<fk.choice
> 用于 Bar
,然后将它们合并为 < name><choice>+<fk.name>+<fk.choice>
。
根据给定的标识符格式生成标识符时,外键可能指向任何位置。在这种情况下,自动化控制器替换了与该资源对应的格式部分,外部键应指向空字符串。例如,如果 Foo
对象的名称为 ="alice"
,则 选择 ="yes",
但 fk field = None
,其生成的标识符为 alice+yes++
。