2015-12-30 18 views
6

sto recupero queste righe da db:combinare i valori di diversi oggetti in un unico dizionario

blog_id='12', field_name='title', translation='title12 in en', lang='en' 
blog_id='12', field_name='desc', translation='desc12 in en', lang='en' 

blog_id='13', field_name='title', translation='title13 in en', lang='en' 
blog_id='13', field_name='desc', translation='desc13 in en', lang='en' 
.... 

e voglio costruire un unico dizionario per ogni blog_id: per esempio

[ 
    {'blog': '12', 'title': 'title12 in en', 'desc': 'desc12 in en'}, 
    {'blog': '13', 'title': 'title13 in en', 'desc': 'desc13 in en'}, 
    .... 
] 

sto provando in questo modo:

res = [] 
dict_ = {} 
for trans in translations: # 'translations' is QuerySet, already filtered by 'en' 
    if trans.blog_id in dict_.values(): 
     dict_[trans.field_name] = trans.translation 
    else: 
     dict_['blog'] = trans.blog_id 
     dict_[trans.field_name] = trans.translation 

    res.append(dict_) 

ma questo è mooolto male, res contiene qui blog 13 3 volte e blog 12 IsNot anche nella lista finale. Mi sento così stupido adesso, cosa mi sto perdendo?

+0

Si sta aggiungendo lo stesso oggetto dizionario per 'res', non stai nemmeno creando nuovi oggetti dict – thefourtheye

+0

@thefourtheye So :(Ho bisogno di creare nuovi dettt dinamicamente in qualche modo sulla strada ... – doniyor

+3

perché non usare il' blog_id' come una chiave esterna e creare un dettato di dicts? –

risposta

4

In primo luogo, si accumulano tutti i dati relativi ad ogni blog_id in un dizionario, come questo

groups = {} 
for trans in translations: 
    groups.setdefault(trans.blog_id, {})[trans.field_name] = trans.translation 

Ora, collegare il corrispondente blog_id a tutti i dizionari accumulati,

for key in groups: 
    groups[key]['blog'] = key 

Ora, basta avere tutti gli values del groups, con groups.values() per ottenere il risultato.

Nota: Se si desidera mantenere l'ordine originale degli elementi in base al blog_id, quindi invece di utilizzare un dizionario normale, utilizzare collections.OrderedDict, come questo

from collections import OrderedDict 
groups = OrderedDict() 
... 
Problemi correlati