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. 修复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

