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

Python调用Azure DevOps API获取AssignedTo字段失败及字段查询咨询

问题背景

我编写了一个Python函数用于从Azure DevOps(ADO)查询中获取结果,代码如下:

def get_query_results(connection, project_name,query_id):

   '''
   Gets the result of a query in ADO
   '''
   results = []
   try:
      wit_client = connection.clients.get_work_item_tracking_client()
      result = wit_client.query_by_id(query_id)

      work_items = result.work_items

      for work_item in work_items:
         work_item_details = wit_client.get_work_item(id=work_item.id, fields=["System.Id", "System.Title","System.AssignedTo"], expand="Relations,Fields")
         results.append({"id": work_item_details.fields['System.Id'], "title": work_item_details.fields['System.Title'], "assigned_to": work_item_details.fields['System.AssignedTo']})
   except Exception as e:
        logger.exception(f'Error fetching repositories from {project_name}: {str(e)}')

   return results

尽管ADO界面中存在“Assigned To”字段,但运行时触发如下错误:

results.append({"id": work_item_details.fields['System.Id'], "title": work_item_details.fields['System.Title'], "assigned_to": work_item_details.fields['System.AssignedTo']})
KeyError: 'System.AssignedTo'

现咨询两个问题:

  1. 如何修复该错误?
  2. 如何检索工作项的可用字段而非仅凭猜测?
问题解答

1. 修复KeyError问题

出现该错误的核心原因是部分工作项的System.AssignedTo字段为空(未分配),ADO API不会返回空值字段,直接通过键名访问就会触发KeyError。界面显示的“Assigned To”对应的系统字段确实是System.AssignedTo,所以无需修改字段引用名,只需处理字段不存在的情况:

方案一:使用字典get()方法设置默认值

results.append({
    "id": work_item_details.fields['System.Id'],
    "title": work_item_details.fields['System.Title'],
    "assigned_to": work_item_details.fields.get('System.AssignedTo', None)
})

get()方法会在字段不存在时返回指定的默认值(这里设为None),避免触发KeyError。

方案二:先判断字段存在性再访问

assigned_to = work_item_details.fields['System.AssignedTo'] if 'System.AssignedTo' in work_item_details.fields else None
results.append({
    "id": work_item_details.fields['System.Id'],
    "title": work_item_details.fields['System.Title'],
    "assigned_to": assigned_to
})

通过条件判断确认字段存在后再取值,逻辑更直观。

另外也可检查ADO查询是否包含System.AssignedTo字段——如果查询本身未返回该字段,后续get_work_item即使指定了字段也可能无法获取,但你已在get_work_item的fields参数中明确指定,所以核心问题还是字段为空的情况。

2. 检索工作项的可用字段

有两种可靠方式获取工作项的可用字段,无需凭猜测:

方式一:通过API获取项目所有工作项字段

使用Work Item Tracking Client的get_fields()方法,一次性获取项目下所有系统字段和自定义字段的完整信息:

def get_all_work_item_fields(connection, project_name):
    wit_client = connection.clients.get_work_item_tracking_client()
    fields = wit_client.get_fields(project=project_name)
    for field in fields:
        print(f"字段显示名: {field.name}, 字段引用名: {field.reference_name}, 类型: {field.type}")

该方法会返回每个字段的显示名、代码中需使用的引用名(如System.Id)、数据类型等信息,完全准确。

方式二:打印单个工作项的实际返回字段

如果只想查看某个具体工作项已填充的字段,可在代码中打印work_item_details.fields的内容:

work_item_details = wit_client.get_work_item(id=work_item.id, expand="Relations,Fields")
# 打印所有字段的键名
print(work_item_details.fields.keys())
# 打印完整字段键值对
print(work_item_details.fields)

这样能直接看到该工作项实际返回的字段,验证System.AssignedTo是否存在。


内容的提问来源于stack exchange,提问作者pf12345678910

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:12:49