2016-03-07 1 views
0

J'utilise simple_salesforce pour interroger une base de données relationnelle CRM. Les données sont interrogées avec SOQL, qui est une variante de SQL spécifiquement pour Salesforce.Nested OrderedDict à la liste imbriquée avec différents niveaux d'imbrication

Renvoie les dictionnaires ordonnés imbriqués. Sur une "jointure", s'il n'y a pas d'enregistrement, il renvoie None. S'il y a un enregistrement, un OrderedDict est renvoyé. La boucle que j'ai n'a pas l'air la plus efficace car elle répète quelques lignes. Je cherche un moyen plus propre d'écrire la boucle.

requête utilisée:

select Id, Subject, Account.Name, Opportunity.Name From Case where ID = '500xxxxxxxxxxxxx' 
Code

:

from collections import OrderedDict 

od = OrderedDict([ 
    (u'totalSize', 1), 
    (u'done', True), 
    (u'records', [OrderedDict([ 
     (u'attributes', OrderedDict([ 
      (u'type', u'Case'), 
      (u'url', u'/services/data/v29.0/sobjects/Case/500xxxxxxxxxxxxxxxx') 
     ]) 
     ), 
     (u'Id', u'500xxxxxxxxxxxxxxxx'), 
     (u'Subject', u"Sample Case 1"), 
     (u'Account', OrderedDict([ 
      (u'attributes', OrderedDict([ 
       (u'type', u'Account'), 
       (u'url', u'/services/data/v29.0/sobjects/Account/001xxxxxxxxxxxxxxxx') 
       ]) 
      ), 
      (u'Name', u'Sample Account 1') 
     ])), 
     (u'Opportunity', None)] 
    )])]) 


output = [] 

def get_items(this_item): 
    for key, value in this_item.iteritems(): 
     if key <> 'attributes': 
      if type(value) is OrderedDict: 
       for key, value in value.iteritems(): 
        if key <> 'attributes': 
         record.append(str(value)) 
      else: 
       record.append(str(value)) 


for item in od['records']: 
    record = [] 
    record.append(get_items(item)) 


    output.append(record) 
print output 

Sortie:

[['500xxxxxxxxxxxxxxxx', 'Sample Case 1', 'Sample Account 1', 'None']] 
+0

s'il vous plaît poster la sortie attendue – MaxU

+0

@MaxU vient de publier sortie et désiré. Merci. – user2242044

+0

Vérifiez simplement le type de 'value' et ne l'imprimez pas s'il s'agit de' collections.OrderedDict' – MaxU

Répondre

1

essayez ceci:

def get_rec_vals(rec): 
    ret_list = [] 
    for key,val in rec.items(): 
     if key == 'attributes': continue 
     if isinstance(val, OrderedDict): 
      # recursive call 
      ret_list.extend(get_rec_vals(val)) 
     else: 
      ret_list.append(val) 
    return ret_list 


output = [get_rec_vals(rec) for rec in od['records']] 
print(output) 

Sortie:

[['500xxxxxxxxxxxxxxxx', 'Sample Case 1', 'Sample Account 1', None]] 

PS Je ne suis pas sûr que cela fonctionnera correctement pour plusieurs enregistrements, de sorte que vous devrez fournir au moins deux dossiers ...

+0

@ Cela a fonctionné. Il est difficile de fournir plusieurs exemples de cas (car j'ai besoin de créer de faux ensembles de données pour des raisons de confidentialité). J'ai cependant essayé plusieurs disques et cela semble fonctionner correctement. Merci. – user2242044

+0

vous êtes les bienvenus – MaxU