Jira 8.20.7 createmeta接口及Python Jira库无法返回全部自定义字段
解决方案:Jira 8.20.7 获取特定项目-工单类型完整字段映射
1. 先排查屏幕配置问题
createmeta接口默认仅返回对应工单类型创建屏幕上的字段。如果缺失的自定义字段(含ServiceDesk字段)未添加到Task类型的创建屏幕,肯定不会出现在返回结果里:
- 进入项目配置字段页(
/plugins/servlet/project-config/<PROJ>/fields) - 找到Task工单类型对应的屏幕方案,检查创建屏幕是否包含缺失字段
- 若未添加,补充后重新调用
createmeta接口即可获取这些字段
2. 单独获取ServiceDesk专属字段
ServiceDesk请求类型的专属字段不会出现在普通createmeta接口中,必须用ServiceDesk专属API获取:
步骤1:获取项目对应的ServiceDesk ID
GET /rest/servicedeskapi/servicedesk?projectKey=<PROJ>
从返回结果中提取id字段,即该项目的ServiceDesk ID。
步骤2:获取关联Task的请求类型ID
GET /rest/servicedeskapi/servicedesk/{serviceDeskId}/requesttype
找到与Task工单类型绑定的请求类型,提取其id(requestTypeId)。
步骤3:拉取该请求类型的所有字段
GET /rest/servicedeskapi/requesttype/{requestTypeId}/field
返回结果中每个字段包含唯一id和name,这就是SD专属的字段列表。
3. 合并字段映射并处理重复名称
将普通createmeta和ServiceDesk API的结果合并,按字段ID去重(ID全局唯一,不受名称重复影响):
Python示例代码
import requests # 基础配置 jira_base = "https://your-jira-domain.com" auth = ("your-username", "your-api-token") proj_key = "<PROJ>" issuetype_id = "<N>" # 1. 获取普通createmeta字段映射 createmeta_url = f"{jira_base}/rest/api/2/issue/createmeta/{proj_key}/issuetype/{issuetype_id}?expand=projects.issuetypes.fields&includeAllFields=true" createmeta_res = requests.get(createmeta_url, auth=auth).json() createmeta_fields = createmeta_res["projects"][0]["issuetypes"][0]["fields"] meta_mapping = {f["id"]: f["name"] for f in createmeta_fields.values()} # 2. 获取ServiceDesk字段映射 # 2.1 拿ServiceDesk ID sd_proj_url = f"{jira_base}/rest/servicedeskapi/servicedesk?projectKey={proj_key}" sd_proj_res = requests.get(sd_proj_url, auth=auth).json() sd_id = sd_proj_res[0]["id"] # 2.2 拿关联Task的请求类型ID(自行匹配实际请求类型名称) rt_url = f"{jira_base}/rest/servicedeskapi/servicedesk/{sd_id}/requesttype" rt_res = requests.get(rt_url, auth=auth).json() rt_id = [item["id"] for item in rt_res if item["name"] == "Task请求类型"][0] # 2.3 拿SD字段 sd_fields_url = f"{jira_base}/rest/servicedeskapi/requesttype/{rt_id}/field" sd_fields_res = requests.get(sd_fields_url, auth=auth).json() sd_mapping = {f["id"]: f["name"] for f in sd_fields_res} # 3. 合并完整映射 full_mapping = {**meta_mapping, **sd_mapping} # 若需按名称分组(处理重复名称) name_to_ids = {} for fid, fname in full_mapping.items(): name_to_ids[fname] = name_to_ids.get(fname, []) + [fid]
4. 权限注意事项
调用ServiceDesk API的账号必须拥有Service Desk Agent权限,否则会返回权限错误。
内容的提问来源于stack exchange,提问作者Phantom of Krankor
相关产品推荐
相关产品推荐

