snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,122 @@
---
title: 字段
description: 了解字段的作用以及如何管理它们。
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## 关于字段
字段就像电子表格中的列。 它们存储不同类型的数据,如文本、数字或日期。 字段可以是标准的(内置的)或自定义的(您创建的)。
### 标准字段
标准字段是内置在Twenty中,用于处理常见的业务需求。
例如,`姓`和`名`是`人`对象中的标准字段。 它们用于存储个人姓名的文本数据。
您无法删除标准字段,但如果不需要,您可以停用它们。
您还可以自定义标准`SELECT`类型字段的选项,例如机会中的`阶段`选项。
<img src="/images/user-guide/fields/standard-fields.png" style={{width:'100%'}} />
### 自定义字段
可以将自定义字段添加到任何对象。 您可以存储文本、数字、日期、下拉选择等。 使用自定义字段来跟踪特定于您业务的信息。
例如,SpaceX的自定义字段可以是`火箭活动状态`,指示火箭是否在运作。
<img src="/images/user-guide/fields/custom-fields.png" style={{width:'100%'}} />
## 字段类型
Twenty 支持多种字段类型:
| 类型 | 描述 | 示例 |
| ----- | ------------------------- | ----------- |
| 地址 | 包含街道、城市、州/省、国家、邮政编码的结构化地址 | 办公地址 |
| 数组 | 文本值列表 | 标签 |
| 布尔值 | 真/假复选框 | 是否活跃 |
| 货币 | 带有货币代码的金额 | 交易金额(USD) |
| 日期 | 日期值 | 关闭日期 |
| 日期和时间 | 带时间的日期 | 会议时间 |
| 域 | 网站域名(用于公司) | acme.com |
| 电子邮件 | 电子邮件地址(含主要 + 附加) | 联系人的电子邮件 |
| JSON | 结构化 JSON 数据 | 自定义元数据 |
| 链接 | 带标签的 URL(主要 + 次要) | 网站、LinkedIn |
| 长文本 | 多行文本 | 描述、备注 |
| 多选 | 从预定义列表中选择多个选项 | 标签、类别 |
| 数字 | 数值(整数或小数) | 数量、分数 |
| 电话 | 带国家代码的电话号码 | 工作电话 |
| 评分 | 星级评分(1-5) | 优先级、分数 |
| 关系 | 链接到其他对象中的记录 | 公司 → 人员 |
| 选择 | 从预定义列表中选择单个选项 | 阶段、状态 |
| 文本 | 单行文本 | 名称、标题 |
## 创建自定义字段
要将自定义字段添加到任何对象,请按照以下步骤操作:
1. 转到左侧栏的`设置`。
2. 转到`数据模型`,然后选择您想要自定义的对象。
3. 继续点击`+ 新建字段`。
4. 选择适合您要求的字段名称和类型。 考虑添加字段描述以便更好地理解。
您新创建的字段现在可以在应用程序的字段中使用。 要将其显示在特定视图中,请单击选项菜单,然后选择`字段`。
<VimeoEmbed videoId="927628219" title="视频演示" />
**快速方法:** 点击任何对象表右上的 **+** 按钮,然后选择`自定义字段`。 这将直接带您进入数据模型设置。
<img src="/images/user-guide/fields/quick-new-field.png" style={{width:'100%'}} />
## 停用字段
您可以停用字段以从应用程序中隐藏它,而不会丢失您的数据。 这更像是隐藏字段而不是删除它。
您可以这样做:
1. 在对象设置中找到您想停用的字段。
2. 点击字段旁边的三点`⋮`打开菜单。
3. 从下拉菜单选择`停用`。
<img src="/images/user-guide/fields/deactivate-field.png" style={{width:'100%'}} />
停用字段会发生什么?
1. **在应用程序中:** 字段消失,您不能向其中添加新值。
2. **现有关系:** 如果它是一个关系字段,现有连接将保留,但不能创建新连接。
3. **通过API访问:** 您仍然可以通过API访问字段及其数据。
您可以重新激活标准字段和自定义字段,或有选择地将其永久删除。
## 使字段唯一
使字段唯一以确保不同记录无法拥有相同的值。 例如,电子邮件地址对每个人都是唯一的。
如果在设置唯一性时出现错误,请检查数据中是否有重复值(包括删除的记录)。
## 索引(高级)
数据库索引由系统自动管理——自己添加索引通常没必要,而且也很容易出错。 在开启高级模式后,每个对象在 `Settings → Data Model → <object>` 下都会有一个 **Indexes** 部分,供你在确实需要索引时使用。
## 字段配置最佳实践
### 命名约定和限制
* **单数和复数名称必须不同**:我们的 GraphQL API 需要为变更提供不同的名称
* **受保护的字段名称**:某些名称保留供系统使用(例如,`Type`、`Application`)
### 货币和电话号码字段
* **默认货币:** 可以通过数据模型进行配置
* **默认国家代码:** 可以通过数据模型为电话号码字段进行配置
### 选择字段
* **可以为每个选择字段选择默认选项**
### 记录文本字段
* **每个对象都有一个主要显示字段:** 此字段出现在最左列,并在与其他对象关联时代表记录。 它必须是文本字段。 例如,`人`使用`姓名`作为主要字段,因此当您将某人关联到公司时,您将在公司的视图中看到他们的姓名。

View File

@@ -0,0 +1,92 @@
---
title: 对象
description: 了解 Twenty 中的标准对象和自定义对象。
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
## 标准对象
标准对象是工作区中预定义的实体,帮助您入门。 它们是共享数据模型的一部分,所有Twenty用户均可访问。 您可以直接使用、进行自定义或将其停用。
<img src="/images/user-guide/objects/standard-objects.png" style={{width:'100%'}} />
### 人员
`People`对象存储您的联系人。 它包含联系信息和交互历史记录,因此您可以在一个地方查看所有客户互动。
### 公司
`Companies`对象存储您的业务帐户。 它包括行业、规模和位置等详细信息。 公司连接到`People`和`Opportunities`对象。
### 机会
`Opportunities`对象存储与交易相关的数据。 它用于跟踪潜在销售从开发到成交的全过程,记录阶段、交易规模、关联公司以及预计成交日期。 您可以在看板布局中查看您的销售流程。
### 备注
`Notes` 对象存储自由格式笔记,可附加到联系人、公司、商机及其他记录。 使用笔记记录会议摘要、重要细节或任何上下文信息。
### 任务
`Tasks` 对象存储待办事项和行动项。 任务可以关联到联系人、公司、商机及其他记录。 跟踪到期日期、负责人和完成状态,以便掌控后续跟进。
## 自定义对象
自定义对象可以存储标准对象无法处理的、组织特有的信息。 例如,如果您是SpaceX,您可能想为火箭和发射创建自定义对象。
<img src="/images/user-guide/objects/custom-objects.png" style={{width:'100%'}} />
### 创建新的自定义对象
要创建新的自定义对象:
1. 转到左侧边栏中的设置。
2. 在工作区下,转到数据模型。 在这里您可以看到您所有现有的标准和自定义对象(活动和禁用对象)的概述。
<VimeoEmbed videoId="926288174" title="视频演示" />
3. 点击顶部的`+ 新对象`。 输入名称(单数和复数),选择图标,添加自定义对象的描述,然后点击保存(在右上角)。 以Listing作为自定义对象的示例,单数为"listing",复数为"listings",以及像“房东创建的用于展示其物业的列表”这样的描述。
4. 您的自定义对象已创建,并会显示在侧边栏中。 您可以立即开始向其中添加记录。
## 管理对象
### 停用对象
如果您不再需要某个标准对象或自定义对象:
1. 进入 设置 → 数据模型
2. 查找您想要停用的对象并单击它
3. 转到对象的 **设置** 标签
4. 单击“停用”按钮
5. 该对象将在您的工作区中隐藏,但数据会被保留
### 重新启用对象
要恢复已停用的对象:
1. 进入 设置 → 数据模型
2. 启用 "停用" 过滤器
3. 寻找已停用的对象 (他们名字旁边有`停用`)
4. 单击`connec`,然后`Activate`重新激活它
5. 该对象及其所有数据将被恢复
## 最佳实践
### 何时创建自定义对象
* **独特的业务实体**:特定于您的行业或流程的事物
* **复杂关系**:当您需要跟踪多个实体之间的关联时
* **可扩展的数据**:当某类事物可能有大量实例时
### 何时改用字段
* **简单属性**:用于描述现有对象的属性
* **类别或标签**:对现有记录进行分类的方式
* **单一值**:不需要独立生命周期的信息
### 对象命名
* **使用清晰、具有描述性的名称**:让对象所代表的内容一目了然
* **遵循约定**:对象名称使用单数形式,集合使用复数形式
* **考虑您的团队**:选择人人都能理解的名称

View File

@@ -0,0 +1,94 @@
---
title: 关系字段
description: 使用关系字段在不同对象之间关联记录。
---
## 关系类型
### 一对多
对象 A 中的一条记录可以关联到对象 B 中的多条记录。
**示例:** 一个公司可以拥有许多人员(员工)。
### 多对一
对象 A 中的多条记录可以关联到对象 B 中的一条记录。
**示例:** 许多人员可以隶属于一个公司。
### 可指向多种对象类型的关系
某些对象在关系的一侧可以关联到多种对象类型。
**示例:** 一条备注可以同时附加到一个人员、一个公司和一个商机。 该备注位于 "多" 侧,连接到多个 "一" 侧。
<img src="/images/user-guide/fields/many-to-one-morph.png" style={{width:'100%'}} />
类似地,一个项目(位于 "一" 侧)可以接收来自多个人员、多个公司和多条备注的关联。
<img src="/images/user-guide/fields/one-to-many-morph.png" style={{width:'100%'}} />
<Warning>
**导入/导出限制**:指向多个对象类型的关系目前尚不支持 CSV 导入/导出。 此功能已在我们的路线图中。
</Warning>
### 多对多
对象 A 中的多条记录可以关联到对象 B 中的多条记录。
**示例:** 许多人员可以关联到许多项目,反之亦然。
多对多关系采用**连接对象**模式:一个连接双方的中间对象。 借助连接关系功能,Twenty 会直接显示最终关联的记录,并在界面中隐藏该中间对象。
<Warning>
**Beta 功能**:使用前必须在 **Settings → Community → Features** 中启用连接关系。
</Warning>
请参阅 [如何创建多对多关系](/l/zh/user-guide/data-model/how-tos/create-many-to-many-relations) 以获取完整的分步指南。
## 创建关系字段
1. 进入 **设置 → 数据模型**
2. 选择要添加关系的对象
3. 点击 **+ 新字段**
4. 将字段类型选择为 **关系**
5. 选择要关联到的目标对象
6. 配置关系设置:
* **源对象上的字段名称**:你正在编辑的对象上的关系字段名称
* **目标对象上的字段名称**:将显示在目标对象上的关系字段名称
* 关系类型(一对多、多对一)
7. 单击 **保存**
## 标准关系
Twenty 内置了标准对象之间的预设关系:
| 来源对象 | 目标对象 | 关系类型 |
| ---- | ---- | ---- |
| 人员 | 公司 | 多对一 |
| 机会 | 公司 | 多对一 |
| 机会 | 人员 | 多对一 |
## 最佳实践
### 规划关系
* **梳理你的数据模型**:在创建关系之前先进行规划
* **考虑方向**:思考由哪个对象 "拥有" 该关系
* **避免循环依赖**:保持数据模型简洁清晰
### 关系命名
* **使用清晰的名称**:使关系所代表的含义一目了然
* **保持一致**:在各个关系中使用类似的命名模式
* **兼顾两端**:为关系的两端分别起合适的名称
### 性能
* **不要过度关联**:过多的关系会拖慢你的工作区
## 限制
* **删除关系**会移除链接,但不会删除相关记录
* **循环关系**应当避免,以确保数据完整性

View File

@@ -0,0 +1,72 @@
---
title: 创建自定义字段
description: 逐步指南:向任何对象添加自定义字段。
---
使用自定义字段可捕获特定于您业务的信息。 可将其添加到任何对象——标准或自定义。
## 步骤
1. 进入 **设置 → 数据模型**
2. 选择要添加字段的对象
3. 点击 **+ 新字段**
4. 选择**字段类型**(所有类型请参见[字段](/l/zh/user-guide/data-model/capabilities/fields))
5. 输入**字段名称**和可选描述
6. 配置特定于该字段的设置(见下文)
7. 单击 **保存**
**快速方法:** 在任意表格视图的列标题末尾点击 **+** → **自定义字段**。
## 在视图中显示字段
新字段不会自动显示。 要显示:
1. 打开该对象的表格视图
2. 点击 **选项 → 字段**
3. 点击字段旁的 **眼睛图标** 以显示该字段
4. 拖动以重新排序
## 配置选项
### 用于选择/多选
1. 点击 **+ 添加选项** 以创建选项
2. 如有需要,设置**默认选项**
3. 拖动以重新排序选项
<Note>
**导入时请使用 API 名称。** 在设置中启用 **高级模式** 以查看 API 名称。 请参见[字段映射](/l/zh/user-guide/data-migration/capabilities/field-mapping)。
</Note>
### 适用于货币字段
设置**默认货币**(USD、EUR 等) 用于新记录。
### 适用于电话字段
设置**默认国家代码**,用于预填新的电话号码。
### 将字段设置为唯一
切换**唯一**选项,以防止各记录之间出现重复值。
<Note>
如果存在重复项(包括已删除记录中的重复项),将会出现错误。 请先清理重复项。
</Note>
### 设置默认值
对于选择字段,您可以选择新记录预先选中的选项。 对于复选框字段,设置默认是否选中。
## 停用字段
1. 进入 **设置 → 数据模型**
2. 找到该字段
3. 点击 **⋮ → 停用**
数据将被保留。 您可以稍后重新启用或永久删除。
## 相关内容
* [字段](/l/zh/user-guide/data-model/capabilities/fields) — 所有字段类型说明
* [数据模型常见问题解答](/l/zh/user-guide/data-model/how-tos/data-model-faq) — 常见问题

View File

@@ -0,0 +1,51 @@
---
title: 创建自定义对象
description: 在 Twenty 中创建自定义对象的分步指南。
---
自定义对象可用于存储您业务独有而标准对象未涵盖的信息。 例如:项目、产品、工单或列表项。
<Note>
**不确定该创建对象还是字段?** 请参阅[了解您的数据模型](/l/zh/user-guide/data-model/overview)以获取指导。
</Note>
## 步骤
1. 进入 **设置 → 数据模型**
2. 点击 **+ 添加对象**
3. 填写:
* **单数名称**(例如,"Listing")
* **复数名称**(例如,"Listings")
* **图标**
* **描述**(可选)
4. 单击 **保存**
您的对象会立即显示在侧边栏中。
## 下一步:添加字段
新建对象默认包含一些基础字段。 添加自定义字段以捕获所需数据:
1. 在 **设置 → 数据模型** 中,选择您的对象
2. 点击 **+ 新字段**
3. 选择字段类型,配置并保存
有关字段类型和配置的详细信息,请参阅[如何创建自定义字段](/l/zh/user-guide/data-model/how-tos/create-custom-fields)。
## 连接到其他对象
要将您的对象与人员、公司或其他对象关联,请创建关系字段。 请参阅[如何创建关系字段](/l/zh/user-guide/data-model/how-tos/create-relation-fields)。
## 停用对象
如果您不再需要某个对象:
1. 转到\*\*设置 -> 数据模型 → 您选择的对象 -> 设置 \*\*
2. 点击 **停用** 按钮
该对象会被隐藏,但数据会被保留。 您可以稍后重新启用或永久删除。
## 相关内容
* [对象](/l/zh/user-guide/data-model/capabilities/objects) — 标准对象与自定义对象
* [数据模型常见问题解答](/l/zh/user-guide/data-model/how-tos/data-model-faq) — 常见问题

View File

@@ -0,0 +1,175 @@
---
title: 创建多对多关系
description: 当双方都有多个条目时,使用连接对象将记录相互关联。
---
多对多关系使您能够在关系双方连接多个记录。 例如:许多 People 可以参与许多 Projects,并且每个 Project 可以包含许多 People。
<Warning>
**Beta 功能**:连接关系目前处于 Beta 阶段。 在按照本指南操作之前,请先在 **Settings → Community → Features** 中启用它们。
</Warning>
<Note>
此功能还需要启用 **Advanced mode**(在 Settings 左下角切换)。
</Note>
## 何时使用多对多
当关系双方都可能存在多个关联时,请使用多对多:
| 关系 | 示例 |
| ----------------- | -------------------------- |
| People ↔ Projects | 一个人参与多个项目;一个项目包含多名团队成员 |
| Companies ↔ Tags | 一个公司可以拥有多个标签;一个标签可以应用于多家公司 |
| Products ↔ Orders | 一个产品可以出现在多个订单中;一个订单包含多个产品 |
## 工作原理
Twenty 在多对多关系中使用 **连接对象** 模式。 连接对象位于两个对象之间,并存储它们之间的关联:
```
People ←→ Project Assignments ←→ Projects
```
该 **Project Assignments** 对象(连接对象)具有:
* 到 People 的关系(多对一)
* 到 Projects 的关系(多对一)
启用连接关系开关后,Twenty 将直接显示已关联的记录,而不再展示中间的连接对象记录。
## 先决条件
1. **在 Beta 功能中启用连接关系**:前往 **Settings → Community → Features** 并启用 **Junction Relations**
2. **启用 Advanced mode**:在 Settings 侧边栏左下角开启 **Advanced mode**
3. 规划您的数据模型:
* 您要连接哪两个对象?
* 连接对象应如何命名?
## 步骤 1:创建连接对象
首先,创建用于保存关联的中间对象。
1. 进入 **设置 → 数据模型**
2. 点击 **+ 添加对象**
3. 使用描述性名称(例如,"Project Assignment"、"Team Member"、"Product Order")
4. 将“跳过创建名称字段”切换为开启
<img src="/images/user-guide/fields/new-pivot-object.png" alt="新建连接对象" />
5. 单击 **保存**
<Tip>
**命名约定**:使用能描述关系的名称,例如 "Project Assignment" 或 "Team Membership"。 这会让数据模型更易理解。
</Tip>
## 第 2 步:在对象与连接对象之间创建关系
从您的两个对象分别向连接对象添加关系字段。
### 第一条关系(对象 A → 连接对象)
1. 在 **Settings → Data Model** 中选择您的第一个对象
2. 单击 **+ 添加关系**
3. 选择连接对象(例如,"Project Assignments")
4. 将关系类型设置为 **One-To-Many**(一个人可以关联到多个分配)
5. 为这些字段命名:
* People 上的字段:例如,"Project Assignments"
* 连接对象上的字段:例如,"Person"
6. 单击 **保存**
### 第二条关系(对象 B → 连接对象)
1. 在 **Settings → Data Model** 中选择您的第二个对象
2. 单击 **+ 添加关系**
3. 选择连接对象(例如,"Project Assignments")
4. 将关系类型设置为 **One-To-Many**(一个项目可以关联到多个分配)
5. 启用 **"This is a relation to a Junction Object"**
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
6. 为这些字段命名:
* 连接对象上的字段:例如,"Project"
* Projects 上的字段:例如,"Team Members"
7. 单击 **保存**
## 步骤 3:配置连接关系的显示方式
现在配置源对象以直接显示已关联的记录,跳过中间的连接对象。
1. 进入 **设置 → 数据模型**
2. 选择第一个对象(例如,"People")
3. 找到指向连接对象的关系字段(例如,"Project Assignments")
4. 点击以编辑该字段
5. 启用 **"This is a relation to a Junction Object"**
6. 选择 **Target relation**(例如,"Project" —— 连接对象上指向另一侧的字段)
7. 单击 **保存**
## 结果
配置完成后:
* 在 **Person** 记录中,"Project Assignments" 字段将直接显示 **Projects**(而非分配记录)
* 在 **Project** 记录中,"Team Members" 字段将直接显示 **People**
连接对象仍然存在并存储关联,但 UI 呈现的是更简洁的多对多视图。
## 示例:People ↔ Projects
以下是完整的操作演示:
### 创建连接对象
* 名称:**Project Assignment**
* 描述:"将人员与其参与的项目关联起来"
### 添加关系
1. **People → Project Assignment**
* 类型:One-to-Many
* People 上的字段:"Project Assignments"
* Assignment 上的字段:"Person"
2. **Projects → Project Assignment**
* 类型:One-to-Many
* Projects 上的字段:"Team Members"
* Assignment 上的字段:"Project"
### 配置连接关系显示
1. 在 **People** 对象上:
* 编辑 "Project Assignments" 字段
* 启用连接关系开关
* 目标:"Project"
2. 在 **Projects** 对象上:
* 编辑 "Team Members" 字段
* 启用连接关系开关
* 目标:"Person"
### 开始使用
* 打开某个 Person 记录 → 直接查看其 Projects
* 打开某个 Project 记录 → 直接查看其团队成员
* 可从任一侧创建新的关联
## 为关联添加额外数据
由于连接对象是一个真实对象,您可以添加自定义字段来存储关系相关的信息:
* **角色**:"Developer"、"Designer"、"Manager"
* **开始日期**:当人加入项目时
* **分配时长**:每周在该项目上的工时
要访问这些数据,请直接导航到连接对象,或通过 API 查询。
## 限制
* **CSV 导入/导出**:不支持直接导入多对多关系。 请改为将记录导入连接对象。
* **筛选器**:按多对多关系进行筛选的选项可能有限。
## 相关内容
* [关系字段](/l/zh/user-guide/data-model/capabilities/relation-fields) — 关系类型说明
* [创建自定义对象](/l/zh/user-guide/data-model/how-tos/create-custom-objects) — 如何创建对象
* [创建关系字段](/l/zh/user-guide/data-model/how-tos/create-relation-fields) — 基本关系设置

View File

@@ -0,0 +1,70 @@
---
title: 创建关系字段
description: 通过关系字段逐步将对象连接起来。
---
关系字段可连接不同对象的记录——例如,将人员链接到公司。
<Note>
**关系名称在创建后无法更改**(它们会影响 API)。 请谨慎规划名称。
</Note>
## 开始之前
请确定:
* 要连接哪些对象? (例如,人员 → 公司)
* 哪一方是“一”端? (例如,公司)
* 哪一方是“多”端? (例如,人员—许多人在同一家公司工作)
* 两端的字段应如何命名?
请参阅[关系字段](/l/zh/user-guide/data-model/capabilities/relation-fields),了解关系类型的说明。
## 步骤
1. 进入 **设置 → 数据模型**
2. 选择要创建关系的对象(通常为“多”端)
3. 点击 **+ 新建字段**
4. 将字段类型选择为 **关系**
5. 选择**目标对象**
6. 选择 **一对多** 或 **多对一**
7. 为关系的**两端**输入字段名称
8. 单击 **保存**
## 示例:人员 → 公司
* 进入 **设置 → 数据模型 → 人员**
* 添加关系字段
* 目标:**公司**
* 类型:**多对一**
* 人员中的字段:**公司**
* 公司中的字段:**员工**
现在,每个人员都可以关联到一家公司,每家公司都会显示其人员。
## 停用关系
1. 进入 **设置 → 数据模型 → 所选对象**
2. 找到该关系字段并点击它
3. 点击 **停用** 按钮
关联会被保留但隐藏。 重新启用即可恢复。
<Note>
**停用关系不会删除记录。** 只会移除它们之间的关联。
</Note>
## 删除关系
1. 进入 **设置 → 数据模型 → 所选对象**
2. 找到该关系字段并点击它
3. 点击 **删除** 按钮
<Note>
仅适用于自定义关系。 标准关系只能被停用。
</Note>
## 相关内容
* [关系字段](/l/zh/user-guide/data-model/capabilities/relation-fields) — 类型和限制
* [如何导入关系](/l/zh/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) — 批量导入关联记录

View File

@@ -0,0 +1,22 @@
---
title: 自定义您的数据模型
description: 数据模型自定义选项概览。
---
Twenty 的数据模型完全可自定义。 创建对象、字段和关系,以符合您的业务。
## 快速链接
| 我想要... | 指南 |
| ------- | ----------------------------------------------------------------- |
| 创建新对象 | [如何创建自定义对象](/l/zh/user-guide/data-model/how-tos/create-custom-objects) |
| 为对象添加字段 | [如何创建自定义字段](/l/zh/user-guide/data-model/how-tos/create-custom-fields) |
| 将对象关联起来 | [如何创建关联字段](/l/zh/user-guide/data-model/how-tos/create-relation-fields) |
## 了解更多
* [理解您的数据模型](/l/zh/user-guide/data-model/overview) — 关键概念与规划建议
* [对象](/l/zh/user-guide/data-model/capabilities/objects) — 标准对象与自定义对象
* [字段](/l/zh/user-guide/data-model/capabilities/fields) — 所有字段类型
* [关联字段](/l/zh/user-guide/data-model/capabilities/relation-fields) — 连接对象
* [数据模型常见问题](/l/zh/user-guide/data-model/how-tos/data-model-faq) — 常见问题

View File

@@ -0,0 +1,157 @@
---
title: 数据模型常见问题解答
description: 关于 Twenty 数据模型的常见问题。
---
## 对象管理
<AccordionGroup>
<Accordion title="我可以删除自定义对象吗?">
是的,可以删除自定义对象。 您也可以先将其停用,这会在界面中隐藏该对象及其数据,同时保留这些数据。
</Accordion>
<Accordion title="我可以删除标准对象(人员、公司等)吗?">
不可以,标准对象无法删除。 您只能将其停用,这会在界面中将其隐藏,但会保留数据。
</Accordion>
<Accordion title="我可以创建多少个自定义对象?">
您可以根据需要创建任意多的自定义对象和字段 — 价格不会变。
</Accordion>
<Accordion title="我可以重命名标准对象吗?">
您可以重命名标准对象的标签(People、Companies、Opportunities),但不能更改其 API 名称。 为了在所有 Twenty 工作区中保持一致性,API 名称是固定的。
</Accordion>
<Accordion title="我可以更改对象的图标吗?">
可以,您可以在 **设置 → 数据模型** 中更改标准对象和自定义对象的图标。
</Accordion>
<Accordion title="我可以在左侧导航栏中重新排列对象吗?">
还不可以。 导航中的对象排序目前是固定的,但该功能计划于未来发布。
</Accordion>
<Accordion title="我可以隐藏左侧导航栏中的对象吗?">
所有活动对象都将出现在导航中。 您可以在 **设置 → 数据模型** 下停用不需要的对象。
</Accordion>
</AccordionGroup>
## 字段功能
<AccordionGroup>
<Accordion title="创建后我可以更改字段类型吗?">
不可以,字段类型在创建后无法更改。 如果您需要其他类型,请创建一个具有正确类型的新字段,迁移您的数据,然后停用旧字段。
</Accordion>
<Accordion title="为什么我需要不同的单复数名称?">
我们的 GraphQL API 针对不同操作使用单复数形式:
* `createPerson`(单数)用于单个记录操作
* `createPeople`(复数)用于批量操作
当单复数形式相同时,这会产生限制,但它改善了开发者的体验。
</Accordion>
<Accordion title="为什么某些字段名称是受保护的?">
某些字段名称如 `Type` 或 `Application` 被保留用于系统使用。 请选择其他名称,如 `Category` 或 `Classification`。
</Accordion>
<Accordion title="停用字段会发生什么?">
* 该字段会在界面中被隐藏
* 现有数据将被保留
* 您仍可通过 API 访问该字段
* 现有关联将保留,但您无法创建新的关联
* 您可以稍后重新启用该字段
</Accordion>
<Accordion title="我可以将字段设为必填吗?">
目前,您无法将自定义字段设为必填。 所有字段都接受空值。 您可以使用工作流在字段为空时发送警报或阻止操作,以强制执行必填字段。
</Accordion>
<Accordion title="唯一与必填有什么区别?">
* **唯一**:任意两条记录在该字段中的值不能相同
* **必填**:该字段必须有值(目前不支持自定义字段)
</Accordion>
<Accordion title="我可以创建公式字段吗?">
公式字段在 **H2 2026** 中。 同时,您可以使用工作流程来自动计算和更新字段值。
</Accordion>
<Accordion title="我可以在我的对象中使用嵌套字段吗?">
嵌套字段将于 **H2 2026**。 目前,您可以使用工作流程从相关对象中获取字段值。 例如,要在人员记录上显示公司的行业信息,可以在人员自定义字段中创建一个自定义字段,并使用工作流程来同步该值。
</Accordion>
<Accordion title="我可以在对象中重新排序字段吗?">
是的,前往设置 -> 数据模型 → 您选择的对象-> 布局,并点击 **自定义记录页面**。 如果此按钮被禁用,您必须创建记录。
</Accordion>
</AccordionGroup>
## 关系
<AccordionGroup>
<Accordion title="我可以创建指向同一对象的关系吗?">
是! 支持自引用关系,并建议在账户层级等用例中使用。 例如,从"公司"到"公司"创建关系,以跟踪父/子账户。
</Accordion>
<Accordion title="我可以创建多对多关系吗?">
多对多的关系出现在 **H2 2026**。 目前,可以创建一个中间对象,建立两个一对多关系作为替代方案。
例如,要关联人员和项目(多对多),请创建一个 "项目分配" 对象,其中包含:
* 到人员的关系(多个分配 → 一名人员)
* 到项目的关系(多个分配 → 一个项目)
</Accordion>
<Accordion title="什么是指向多个对象类型的关系(Morph 关系)?">
这使单个对象能够通过一个字段关联到多种不同的对象类型。 例如,备注可以同时附加到人员、公司和商机。
每条备注同时关联到一名人员、一家公司和一个商机。
在 [关系字段](/l/zh/user-guide/data-model/capabilities/relation-fields) 中了解更多。
</Accordion>
<Accordion title="同一对对象之间可以有多个关系吗?">
可以,您可以在同一对对象之间创建多个关系。 例如,一个公司可以同时与人员建立 "主要联系人" 和 "账单联系人" 两个关系。
</Accordion>
<Accordion title="当我删除一条记录时,关系会发生什么变化?">
当您删除记录时,相关记录中的关系链接会被移除。 相关记录本身不会被删除。
</Accordion>
<Accordion title="我可以创建循环关系吗?">
尽管在技术上可行,循环关系(A → B → C → A)应尽量避免,因为它们可能导致混淆并带来潜在的性能问题。
</Accordion>
</AccordionGroup>
## 访问权限
<AccordionGroup>
<Accordion title="我在哪里可以查看和编辑我的数据模型?">
前往 **设置 → 数据模型** 查看并编辑您的所有对象和字段。
</Accordion>
<Accordion title="为什么我在设置中看不到数据模型?">
请联系您的工作区管理员。 数据模型访问通常仅限于管理员。
</Accordion>
</AccordionGroup>
## 数据管理
<AccordionGroup>
<Accordion title="记录数量是否有限制?">
记录数量没有硬性上限。 但是,非常大的数据集可能会影响某些视图中的性能。 使用筛选器和视图高效管理大型数据集。
</Accordion>
<Accordion title="我可以将数据导入自定义对象吗?">
是的,您可以将 CSV 数据导入任何对象,包括自定义对象。 导入过程支持自定义字段的映射。 参见 [如何准备 CSV 文件](/l/zh/user-guide/data-migration/how-tos/prepare-your-csv-files)。
</Accordion>
<Accordion title="我可以导出我的数据模型配置吗?">
目前,数据模型配置没有内置导出功能。 如果您需要在工作区之间迁移数据模型,请联系支持团队。
</Accordion>
<Accordion title="单个对象可以有多少字段?">
单个对象可以拥有的最大字段数为 1600个字段,按Postgres 限制, 包括现有字段和删除字段。 请注意,如果达到1600个字段的上限,那么20个不会修复您的工作空间,因为它属于我们的公平使用政策。
</Accordion>
</AccordionGroup>
## 需要更多帮助吗?
查看我们的 [实施服务](/l/zh/user-guide/getting-started/capabilities/implementation-services) 以获取复杂数据模型设计方面的帮助。

View File

@@ -0,0 +1,177 @@
---
title: 数据模型
description: 了解什么是数据模型,以及如何设计一个适合您业务的模型。
---
## 什么是数据模型?
数据模型是定义信息在您的CRM中如何组织的结构。 可以把它看作您的客户数据的**蓝图** — 您只需设计一次,然后用实际数据将其填充。
## 关键概念
### 对象
**对象**是您的 CRM 中数据的主要类别。 每个对象代表您想跟踪的一类事物。
Twenty 自带标准对象:
* **People** — 个人(联系人、潜在客户、合作伙伴)
* **Companies** — 组织
* **Opportunities** — 交易或销售
* **备注** - 附加于记录的备注
* **Tasks** — 与记录关联的待办事项
您也可以为特定于您业务的任何内容创建**自定义对象**(例如,Projects、Subscriptions、Events)。
### 字段
**字段**是用于描述每个对象的属性或特征。 它们存储实际信息。
例如,**People** 对象具有如下字段:
* 名称
* 电子邮件
* 电话
* 职位
* 公司(与 Companies 对象的关联)
字段有不同的**类型**:文本、数字、日期、单选、多选、关联等。 您可以向任何对象添加自定义字段。
### 记录
**记录**是对象中的单个条目 — 您创建和管理的实际数据。
例如:
* "John Smith" 是 People 对象中的一个**记录**
* "Acme Corp" 是 Companies 对象中的一个**记录**
**类比:**
| 数据模型概念 | 现实类比 |
| ------ | ------------- |
| **对象** | 书中的章节(类别) |
| **字段** | 电子表格中的列(属性) |
| **记录** | 电子表格中的行(实际条目) |
您只需设计一次数据模型(对象 + 字段),然后在该结构内创建许多记录。
## 为什么要自定义您的数据模型?
每个企业的运作方式都不尽相同。 自定义数据模型意味着您可以围绕**您的**流程来塑造 Twenty,而不是把您的流程硬塞进一个僵化的系统。
Twenty 提供完全的灵活性:
* 根据需要创建任意数量的自定义对象
* 无限添加自定义字段
* 价格不会因自定义而变化
## 设计数据模型的提示
### 1. 从您的核心对象开始
识别您所使用的主要概念。 Twenty 已提供:
* **People** — 您的联系人
* **Companies** — 您的客户
* **Opportunities** — 您的商机
想想您还可能需要什么:
* Stripe 需要一个 `Subscriptions` 对象
* Airbnb 需要一个 `Trips` 对象
* 加速器需要一个 `Batches` 对象
### 2. 用字段表达变体,而不是创建新对象
如果某项只是现有对象的一个特征,请将其设为**字段**。
**字段适用于:**
* 类别和标签(例如,Companies 的 `Industry`)
* 状态值(例如,Opportunities 的 `Stage`)
* 属性和特性
### 3. 当某个概念可独立存在时创建对象
如果该概念有自己的生命周期、属性或关系,就值得设为一个对象。
**为以下情况创建对象:**
* **Projects** — 具有截止日期、所有者和任务
* **Subscriptions** — 连接公司、产品和发票
* **Events** — 涉及与会者和后续行动
这些超出单个字段的范围,因为它们携带自己的数据和关系。
### 4. 当记录数量不确定时创建对象
如果某个事物可以被多次关联且数量不确定,请使用对象。
**不佳的做法:**
创建诸如 `Product 1`、`Product 2`、`Product 3` 等字段...
**较佳的做法:**
创建一个 `Products` 对象并将其关联到记录。 这样就能在不更改模型的情况下支持一个、两个,甚至上百个产品。
### 5. 先保持简单
从字段开始。 仅当您感到受限时,才迁移到新对象:
* 单个对象上的字段过多
* 重复的记录,本应分开
* 不够契合的关系
## 关于人、公司和机会的特别注意事项
<Warning>
**电子邮件和日历同步仅适用于人、公司和机会。**
只有在这些对象中,您才能从您的邮箱/日历访问已同步的电子邮件和会议。 我们建议尽可能多地使用它们。
</Warning>
**最佳实践:**
* 如果您需要对人进行分类,请使用字段(而不是新对象)
* 示例:使用 `Person Type` 字段,取值为“潜在客户”和“合作伙伴”,而不是创建单独的对象
* 创建不同的**视图**进行筛选:一个显示合作伙伴,另一个显示潜在客户
**并非每条记录都适用的字段是可以接受的。** 例如,在“人”对象上设置 `Referral Link` 字段,仅当 `Person Type = Partner` 时适用。 在不相关的视图中隐藏此字段。
## 指导选择的问题
问问自己:
<Check>这只是我已拥有的事物的属性,还是需要它自己的属性?</Check>
<Check>我是否需要为每个记录跟踪多个此类项目,而无法提前知道有多少?</Check>
<Check>这一概念是否连接多个不同对象,而不仅仅是一个?</Check>
<Check>它是否有其自身的生命周期(阶段、开始/结束日期)?</Check>
如果对一个或多个问题的回答是“是”,可能是时候创建一个新对象了。
## 访问您的数据模型
1. 转到左侧边栏中的**设置**
2. 单击 **数据模型**
3. 查看您的所有对象(标准和自定义)
4. 单击任一对象以查看并编辑其字段
<Note>
**在设置中看不到数据模型?**
对数据模型的访问通常仅限于管理员。 如果您需要访问权限,请联系您的工作区管理员。
</Note>
## 下一步
一旦您规划好数据模型:
* [如何创建自定义对象](/l/zh/user-guide/data-model/how-tos/create-custom-objects)
* [如何创建自定义字段](/l/zh/user-guide/data-model/how-tos/create-custom-fields)
* [如何创建关系字段](/l/zh/user-guide/data-model/how-tos/create-relation-fields)
## 需要帮助?
<Tip>
需要帮助来设计你的数据模型吗? [查找认证的20个伙伴](https://twenty.com/partners/list?categories=SOLUTIONING\&ref=docs-data-model) 设计和构建您的物件、 字段和关系。
</Tip>