2010-05-08 2 views
0

Im пытается итерации по списку nestled dict. Первый уровень работает отлично. Но второй уровень рассматривается как строка, а не dict.Нельзя перебирать nestled dict в django

В моем шаблоне я это:

{% for product in Products %} 
<li> 
    <p>{{ product }}</p> 
    {% for partType in product.parts %} 
     <p>{{ partType }}</p> 
     {% for part in partType %} 
      <p>{{ part }}</p> 
     {% endfor %} 
    {% endfor %} 
</li> 
{% endfor %} 

Это {{часть}}, что просто перечислить 1 символ в то время на основе partType. И это швы, что это рассматривается как строка. Тем не менее, я могу использовать точечную нотацию для всех dict, но не для цикла for. Текущий результат выглядит следующим образом:

Color  
C  
o  
l  
o  
r  
Style  
S 
..... 

объект Products выглядит в журнале:

[{'product': <models.Products.Product object at 0x1076ac9d0>, 'parts': {u'Color': {'default': u'Red', 'optional': [u'Red', u'Blue']}, u'Style': {'default': u'Nice', 'optional': [u'Nice']}, u'Size': {'default': u'8', 'optional': [u'8', u'8.5']}}}] 

То, что я пытаюсь сделать, это соединить вместе Dict/список для продукта из ряда различных SQL-запросов.

Веб-обработчик выглядит следующим образом:

typeData = Products.ProductPartTypes.all() 
    productData = Products.Product.all() 
    langCode = 'en' 
    productList = [] 

    for product in productData: 
     typeDict = {} 
     productDict = {} 
     for type in typeData: 
      typeDict[type.typeId] = { 'default' : '', 'optional' : [] } 

     productDict['product'] = product 
     productDict['parts'] = typeDict 

     defaultPartsData = Products.ProductParts.gql('WHERE __key__ IN :key', key = product.defaultParts) 
     optionalPartsData = Products.ProductParts.gql('WHERE __key__ IN :key', key = product.optionalParts) 

     for defaultPart in defaultPartsData: 
      label = Products.ProductPartLabels.gql('WHERE __key__ IN :key AND partLangCode = :langCode', key = defaultPart.partLabelList, langCode = langCode).get() 
      productDict['parts'][defaultPart.type.typeId]['default'] = label.partLangLabel 

     for optionalPart in optionalPartsData: 
      label = Products.ProductPartLabels.gql('WHERE __key__ IN :key AND partLangCode = :langCode', key = optionalPart.partLabelList, langCode = langCode).get() 
      productDict['parts'][optionalPart.type.typeId]['optional'].append(label.partLangLabel) 

     productList.append(productDict)  

    logging.info(productList) 
    templateData = { 'Languages' : Settings.Languges.all().order('langCode'), 'ProductPartTypes' : typeData, 'Products' : productList } 

Я попытался сделать в Dict в ряде различных способов. Как и вначале составление списка, затем дикта, я использовал тюльпы, о которых я мог думать.

Любая помощь приветствуется!

Bouns: Если у кого-то есть другой подход к запросам SQL, это более чем приветствуется. Я чувствую, что это глупо, чтобы запустить такое количество запросов. Что происходит, что каждая часть продукта имеет другую базу меток на langCode.

..fredrik

+0

В хранилище данных App Engine не используются SQL-запросы. – geoffspear

+0

О, мой плохой. Я имею в виду GQL :) – fredrik

ответ

7

Итерации над ДИКТ дает ключи. Вы хотите либо метод iteritems(), либо itervalues().

{% for partName, partType in product.parts.iteritems %} 
    <p>{{ partName }}</p> 
    {% for part in partType %} 
     <p>{{ part }}</p> 
    {% endfor %} 
    .... 
+0

Сладкий, спасибо. Единственное, что может потребоваться, если вы используете Google App Engine, вам нужно установить версию django в 1.1. Стандартная версия в GAE составляет 0,96, и она не поддерживает 5 ключевых слов для циклов. – fredrik

Смежные вопросы