我正试图通过salesforce beatbox python客户机更新一个记录upsert操作似乎工作得很好,但我还不太清楚如何将externalid指定为外键:
尝试插入:
consolidatedToInsert = []
for id,ce in ConsolidatedEbills.items():
consolidatedToInsert.append(
{
'type':'consolidated_ebill__c',
'Account__r':{'type':'Account','ETL_Natural_Key__c':ce['CLASS_REFERENCE']},
'ETL_Natural_Key__c':ce['ISSUE_UNIQUE_ID']
}
)
print consolidatedToInsert[0]
pc.login('USERNAME', 'TOTALLYREALPASSWORD')
ret = pc.upsert('ETL_Natural_Key__c',consolidatedToInsert[0])
print ret
给出错误:
'外部外键引用没有引用有效的实体:Account\r'
[{'iscreated':false,'errors':[{'fields':[],'message':'外部外键引用没有引用有效的实体:account\u r,'statuscode':'invalid\u fiel
d'}],'id':'','success':false,'created':false}]
soap示例和错误文本的特殊性似乎表明这是可能的,但我在有关使用外部id插入的文档中几乎找不到。
仔细看,我不确定这是否可能,一个完全损坏的帐户密钥似乎悄无声息地传递,就好像它甚至不是XML翻译的目标一样,但我很想错了。
快速更改为pythonclient.py 422:0:
for k,v in field_dict.items():
if v is None:
fieldsToNull.append(k)
field_dict[k] = []
if k.endswith('__r') and isinstance(v,dict):
pass
elif hasattr(v,'__iter__'):
if len(v) == 0:
fieldsToNull.append(k)
else:
field_dict[k] = ";".join(v)
还有另一张给beatbox.py 375:0的
for fn in sObjects.keys():
if (fn != 'type'):
if (isinstance(sObjects[fn],dict)):
self.writeSObjects(s, sObjects[fn], fn)
else:
s.writeStringElement(_sobjectNs, fn, sObjects[fn])
它就像某种黑暗魔法。
最佳答案
目前Beatbox不支持这样序列化嵌套字典,这是您尝试执行的外部解析所必需的。(如果查看生成的请求,可以看到嵌套字典只是作为字符串序列化的)。