访问由 simple-salesforce 返回的内部有序字典

Accessing inner ordered dictionaries returned by simple-salesforce

我正在使用 simple-salesforce 通过 Python 查询 salesforce。我的查询 returns 以下格式的 ordereddict

OrderedDict([('totalSize', 1), ('done', True), ('records', [OrderedDict([('attributes', OrderedDict([('type', 'Case'), ('url', 'www.blah.com')])), ('Number', '6904'), ('Severity', 'P1'), ('Product__c', 'd231'), ('Status', 'Available'), ('Case_Comments__r', OrderedDict([('totalSize', 1), ('done', True), ('records', [OrderedDict([('attributes', OrderedDict([('type', 'Comment__c'), ('url', 'www.blah.com')])), ('CreatedDate', '2019-11-05T12:10:06.000+0000'), ('Text__c', 'dummy text'), ('Created_By_Name', 'TEST USER')])])]))])])])

我想提取特定数据,但在访问内部有序字典时遇到问题。例如,我可以通过执行以下 'Number' 和 'Severity'

list1 = [(record['Number'], record['Severity']) for record in data['records']]

但我还需要访问 'Comment_c',我尝试了以下但失败了。

list1 = [(record['Number'], record['Severity'], record['Case_Comments__r']['records']['Text__c']) for record in data['records']]

失败 "TypeError: list indices must be integers or slices, not str"

如您所见,record['Case_Comments__r']['records']OrderedDict 的列表:

('records', [OrderedDict(...), ...])

所以不可能用 record['Case_Comments__r']['records']['Text__c'] 这样的字符串索引这个列表 - 你需要遍历列表并从每个 OrderedDict:

中提取数据
..., record['Severity'], [comment['Text__c'] for comment in record['Case_Comments__r']['records']]

这是从 simple-salesforce 查询结果中解析 OrderedDict 的另一种方法,它允许您在搜索的内容是 None 时设置默认值。

def get_field_data_from_salesforce_object(sf_session, field, default="some_default"):
    field_query = f"Select {field} FROM Case WHERE Id = 'some-id'"
    field_data = sf_session.query(field_query)

    for k, v in field_data.items():
        if k == "records":
            for item in v:
                field_key = item.get(field)

                if field_key is None:
                    if default is not None:
                        field_key = default
                    else:
                        field_key = "(Not provided)"
    return field_key