Skip to main content
自定义对象是你的应用在工作区中添加的新记录类型——Post Card、Invoice、Subscription,或任何特定于你业务领域的内容。 每个对象都会声明其模式(字段、关系、默认值)以及一个在多次同步和部署中保持稳定的通用标识符。
src/objects/post-card.object.ts

关键点

  • universalIdentifier 必须在各次部署间保持唯一且稳定。
  • 每个字段都需要 nametypelabel 以及其自身稳定的 universalIdentifier
  • fields 数组是可选的——你可以定义没有自定义字段的对象。
  • 此处定义的内联字段需要 objectUniversalIdentifier——它会从父对象继承。 使用defineField()为你不拥有的对象添加字段。
  • 你可以使用 yarn twenty dev:add object 脚手架创建新对象,它会引导你完成命名、字段和关系。 参见 Architecture → Scaffolding entities
基础字段会自动添加。 当你定义自定义对象时,Twenty 会为你创建标准字段,例如 idnamecreatedAtupdatedAtcreatedByupdatedBydeletedAt。 你无需在 fields 数组中声明这些字段——只需声明你的自定义字段。 你可以通过声明一个同名字段来覆盖默认字段,但这么做通常并不是一个好主意。

字段类型

twenty-sdk/define 导出的完整 FieldType 值集合: 复合类型会存储多个子字段(例如,FULL_NAME = 名 + 姓;CURRENCY = amountMicros + currencyCode)。 SELECTMULTI_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
  • 在 UI 中展示此对象——参见 ViewsNavigation Menu Items,将其放入侧边栏。