Directus中数据模型字段关联集合及不可变键值配置咨询
在Directus中实现键值关联且值不可修改的配置方案
我来帮你梳理下实现这个需求的两种方案——优先推荐用内置配置搞定,不需要额外写脚本;如果需要更灵活的逻辑,再考虑用脚本实现:
一、内置配置实现(无脚本)
这种方式完全用Directus自带的字段类型和权限设置就能实现,步骤如下:
- 创建关联字段:
假设你有两个集合:目标集合(需要添加键值关联的集合)和数据源集合(存储「Nume」字段的集合)。- 在
目标集合中添加一个多对一(M2O)关联字段,关联到数据源集合 - 字段Key可以设为
selected_key,显示名称填“选择键”;在「Display」选项里选「Dropdown」或「Select」,并把选项标签设置为Nume字段,这样用户选择时看到的就是Nume的值
- 在
- 添加只读的“对应值”字段:
在目标集合中添加一个计算字段(Computed Field):- 字段Key设为
display_value,显示名称填“对应值” - 计算类型选「SQL」(适配SQL类数据库),输入SQL语句:
SELECT nume FROM 数据源集合 WHERE id = ${selected_key}(注意替换成你的集合实际名称) - 进入「Permissions」设置,把这个字段的「Create」和「Update」权限设为禁止,这样用户只能看到值,无法修改
- 字段Key设为
这样配置后,用户选择“选择键”时,“对应值”会自动显示对应的Nume内容,且完全不可修改。
二、自定义脚本实现(灵活扩展)
如果内置计算字段满足不了你的特殊逻辑(比如需要处理复杂的关联规则),可以用Directus的Flows工作流或者自定义Hook扩展来实现:
1. 用Flows工作流实现(推荐,无需部署)
Flows是Directus自带的可视化工作流工具,很适合做这类自动同步操作:
- 进入Directus后台,点击左侧菜单的「Flows」→ 创建新Flow
- 触发条件选择「Item Created」和「Item Updated」,关联到你的
目标集合 - 添加一个「Run Script」操作,编写JavaScript脚本:
// 获取当前选中的关联ID const selectedKeyId = $payload.selected_key; // 查询数据源集合对应的Nume值 const referenceItem = await directus.items('数据源集合').readOne(selectedKeyId); // 更新当前条目对应的值字段 await directus.items('目标集合').updateOne($payload.id, { display_value: referenceItem.nume }); - 同样把
display_value字段的修改权限禁掉,确保用户无法编辑
2. 自定义Hook扩展(底层逻辑)
如果需要更底层的触发逻辑,可以写Directus Hook扩展:
- 脚本存放位置:在你的Directus项目根目录下的
extensions/hooks文件夹里,创建一个新的子文件夹(比如sync-key-value),然后在里面新建index.js文件 - 编写Hook代码:
export default ({ filter }, { services }) => { const { ItemsService } = services; // 监听目标集合的创建事件 filter('items.create.目标集合', async (payload, meta) => { if (payload.selected_key) { const itemsService = new ItemsService('数据源集合', { schema: meta.schema }); const referenceItem = await itemsService.readOne(payload.selected_key); payload.display_value = referenceItem.nume; } return payload; }); // 监听目标集合的更新事件 filter('items.update.目标集合', async (payload, meta) => { if (payload.selected_key) { const itemsService = new ItemsService('数据源集合', { schema: meta.schema }); const referenceItem = await itemsService.readOne(payload.selected_key); payload.display_value = referenceItem.nume; } return payload; }); }; - 重启Directus服务,这个Hook就会自动生效,在创建或更新条目时同步Nume值到
display_value字段
内容的提问来源于stack exchange,提问作者Bat Man
相关产品推荐
相关产品推荐

