2015-12-30 19 views
6

ja ściągam te wiersze z DB:połączyć wartości kilku obiektów w jednym słowniku

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' 
.... 

i chcę zbudować jeden słownik dla każdego blog_id: np

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

próbuję w ten sposób:

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_) 

ale to soo źle, res zawiera tutaj blog 13 3 razy i blog 12 isnot nawet w ostatnim liście. Czuję się teraz tak głupi, czego mi brakuje?

+0

dodawania tego samego słownika obiektu do 'res', nie tworzysz nawet nowych obiektów dyktowania – thefourtheye

+0

@thefourtheye Wiem :(Potrzebuję stworzyć nowy dykt dynamicznie jakoś po drodze ... – doniyor

+3

dlaczego nie używać' blog_id' jako klucza zewnętrznego i stworzyć dyktando dyktuje? –

Odpowiedz

4

Najpierw gromadzić wszystkie dane odpowiadające każdej blog_id w słowniku, jak to

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

Teraz dołączyć odpowiedni blog_id do wszystkich zgromadzonych słowników,

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

Teraz, po prostu wszystkie values z groups, z groups.values(), aby uzyskać wynik.

Uwaga: Jeśli chcesz zachować oryginalną kolejność elementów na podstawie blog_id, to zamiast używać zwykłego słownika, należy collections.OrderedDict, jak to

from collections import OrderedDict 
groups = OrderedDict() 
... 
Powiązane problemy