You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Directus中数据模型字段关联集合及不可变键值配置咨询

在Directus中实现键值关联且值不可修改的配置方案

我来帮你梳理下实现这个需求的两种方案——优先推荐用内置配置搞定,不需要额外写脚本;如果需要更灵活的逻辑,再考虑用脚本实现:

一、内置配置实现(无脚本)

这种方式完全用Directus自带的字段类型和权限设置就能实现,步骤如下:

  1. 创建关联字段:
    假设你有两个集合:目标集合(需要添加键值关联的集合)和数据源集合(存储「Nume」字段的集合)。
    • 在目标集合中添加一个多对一(M2O)关联字段,关联到数据源集合
    • 字段Key可以设为selected_key,显示名称填“选择键”;在「Display」选项里选「Dropdown」或「Select」,并把选项标签设置为Nume字段,这样用户选择时看到的就是Nume的值
  2. 添加只读的“对应值”字段:
    在目标集合中添加一个计算字段(Computed Field):
    • 字段Key设为display_value,显示名称填“对应值”
    • 计算类型选「SQL」(适配SQL类数据库),输入SQL语句:SELECT nume FROM 数据源集合 WHERE id = ${selected_key}(注意替换成你的集合实际名称)
    • 进入「Permissions」设置,把这个字段的「Create」和「Update」权限设为禁止,这样用户只能看到值,无法修改

这样配置后,用户选择“选择键”时,“对应值”会自动显示对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:27:30