src/objects/post-card.object.ts
关键点
universalIdentifier必须在各次部署间保持唯一且稳定。- 每个字段都需要
name、type、label以及其自身稳定的universalIdentifier。 fields数组是可选的——你可以定义没有自定义字段的对象。openRecordIn设置在点击此对象的记录时,它们会在何处打开:ObjectOpenRecordIn.USER_CHOICE(默认,遵循每位工作区成员在 Settings → Experience 中的个人偏好)、ObjectOpenRecordIn.SIDE_PANEL,或ObjectOpenRecordIn.RECORD_PAGE。 将其固定为RECORD_PAGE,用于那些需要完整页面才能正常使用的记录(就像工作流和仪表盘那样),或者固定为SIDE_PANEL,用于那些只适合作为快速面板显示的记录(就像日历事件那样)。writability控制在角色权限生效之前,哪些主体可以对该对象的记录进行任何写入操作:MetadataWritability.OPEN(默认值 — 由工作区角色决定)、MetadataWritability.APPLICATION(只有你的应用自身的逻辑函数可以创建、更新或删除记录;将其用于类似配置的对象,这类对象的记录定义行为,因此具有广泛记录访问权限的工作区成员无法通过 API 编辑这些记录)、或者MetadataWritability.SYSTEM(保留用于平台管理的数据)。 读取不受影响 — 这是在服务器端强制执行的,不同于isUIEditable,后者只会隐藏 UI 的可操作入口。 它同样存在于每个字段上,但其限制只能比对象级别更严格。- 此处定义的内联字段不需要
objectUniversalIdentifier——它会从父对象继承。 使用defineField()为你不拥有的对象添加字段。 - 你可以使用
yarn twenty dev:add object脚手架创建新对象,它会引导你完成命名、字段和关系。 参见 Architecture → Scaffolding entities。
基础字段会自动添加。 当你定义自定义对象时,Twenty 会为你创建标准字段,例如
id、name、createdAt、updatedAt、createdBy、updatedBy 和 deletedAt。 你无需在 fields 数组中声明这些字段——只需声明你的自定义字段。 你可以通过声明一个同名字段来覆盖默认字段,但这么做通常并不是一个好主意。字段类型
从twenty-sdk/define 导出的完整 FieldType 值集合:
复合类型会存储多个子字段(例如,
FULL_NAME = 名 + 姓;CURRENCY = amountMicros + currencyCode)。 SELECT 和 MULTI_SELECT 需要一个如上示例所示的 options 数组。
默认值
字面量字符串默认值必须在字符串内部用单引号包裹——应写成defaultValue: "'Draft'",而不是 defaultValue: "Draft"。 这就是上面的 status 字段使用 `'${PostCardStatus.DRAFT}'` 的原因。
未加引号的字符串保留用于计算得到的默认值,这些默认值会在创建记录时进行求值:
'uuid'— 生成一个 UUID(用于UUID字段)'now'— 当前时间戳(用于DATE_TIME字段)
ACTOR 字段上的 { source: "'MANUAL'" })以及 SELECT/MULTI_SELECT 值。 在构建应用时,未加引号的字面字符串默认值会触发警告。
可空性
isNullable 控制字段是否接受 NULL。 它默认是 true —— 对可选字段可以省略。 将 isNullable 设为 false,可在数据库层面将字段设为必填。
对 isNullable 的更改会在每次同步时应用,包括更新现有字段的同步——因此你可以通过编辑 manifest 并重新同步来切换字段的可空性。
将现有字段改为不可为空时需要提供默认值。 当你将字段更改为
isNullable: false 时,还必须提供一个非空的 defaultValue。 在应用 NOT NULL 约束之前,默认值会为所有现有的 NULL 行进行回填;如果没有默认值,同步将失败,并出现错误:Default value cannot be null for non-nullable fields。 关系字段和 TS_VECTOR 字段始终可为空,因此 isNullable 对它们不起作用。接下来
- 将此对象与其他对象关联——关于双向关系模式,参见 Relations。
- 为其他应用的对象添加字段——关于
defineField(),参见 Extending Objects。 - 在界面中显示此对象 — 请参阅 导航菜单项 以添加侧边栏条目;请参阅 视图 以添加自定义列表配置。