Обход многомерного словаря в Джанго - PullRequest
0 голосов
/ 18 июня 2009

В мой первый день в Python-land я являюсь PHP-парнем, пытаюсь преобразовать php-сайт в python (опыт обучения), и мне не терпится посоветоваться. Я никогда не думал, что будет так сложно использовать многомерные массивы или словари, как вы их называете питонеры.

Так что я могу создавать многомерные массивы, используя this , но я не могу зациклить его в шаблоне django. это не работает, но я представляю, что не могу пройти через него, если смогу заставить его работать.

{% for key,val in dictionary.items %}
Кажется,

работает только для реальных словарей, а не для многомерных словарей Custon.

Я создаю свой словарь из запроса sql:

vid[ video[ 7 ] ][ 'cat_short_name' ] = video[ 2 ]
vid[ video[ 7 ] ][ 'cat_name' ] = video[ 1 ]
vid[ video[ 7 ] ][ 'cat_id' ] = video[ 7 ]

vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_short_name' ] = video[ 5 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_name' ] = video[ 4 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'comp_website' ] = video[ 6 ]

vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'top_video' ] = 0
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_id' ] = video[ 8 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_name' ] = video[ 9 ]
vid[ video[ 7 ] ][ 'companies' ][ video[ 14 ] ][ 'videos' ][ video[ 8 ] ][ 'vid_url' ] = video[ 10 ]

Мне нужно собрать все компании определенной категории, а затем получить все видео этой компании, чтобы я мог легко вставить их в свой шаблон. Вот как я это сделал в php, создав один огромный массив. Попытка дублировать в Python оказалась трудной.

Я подумал, что, может быть, я смогу сделать обратный поиск в django, используя set_MODEL, но я не мог этого понять.

Буду признателен за любую помощь в достижении моей цели. Я надеюсь, что мой вопрос ясен

EDIT:

Когда я закончу цикл в моем шаблоне, он будет выглядеть следующим образом ...

<h1>Category</h1>
   <h2>Company</h2>
   <ul>
        <li>video</li>
    </ul>
    <h2>Company</h2>
    <ul>
        <li>video</li>
        <li>video</li>
    </ul>
<h1>Category</h1>
   <h2>Company</h2>
   <ul>
        <li>video</li>
    </ul>
    <h2>Company</h2>
    <ul>
        <li>video</li>
        <li>video</li>
    </ul>

Ответы [ 5 ]

3 голосов
/ 18 июня 2009

Вы должны использовать встроенный ORM вместо того, чтобы использовать свои собственные запросы (по крайней мере, для чего-то простого, как это), что делает вещи намного проще (если вы также создали свои модели в своих моделях). py файл)

На ваш взгляд:

def categories_view(request):
    categories = Categories.objects.all()   #maybe put an order_by or filter here
    return render_to_response("your_template.html", {'categories':categories})

В вашем шаблоне:

{% for category in categories %}
    <h1>{{ category.name }}</h1>
    {% for company in category.company_set.all %}
        <h2>{{ company.name }}</h2>
        <ul>
        {% for video in company.video_set.all %}
            <li>{{ video.name }}</li>
        {% endfor %}
        </ul>
    {% endfor %}
{% endfor %}

Я не проверял это, но оно должно работать. Сравните этот код с тем, что вам нужно было бы написать, если бы вы не использовали ORM в PHP или Python.

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

Обновление: изменен код для использования "_set.all"

2 голосов
/ 18 июня 2009

При переходе с одного языка или фреймворка на другой вы должны понимать, что обычно не стоит писать точно такой же код, даже если вы можете.

Например:

Я создаю свой словарь из SQL-запроса

Почему ты это делаешь? Способ представления объектов из базы данных в Django - использовать модель. Это позаботится о многих вещах для вас, включая SQL, но также поможет в переборе связанных таблиц.

0 голосов
/ 18 июня 2009

Если вы создали сложный словарь следующим образом:

vid[ video[ 7 ], 'cat_short_name' ] = video[ 2 ]
vid[ video[ 7 ], 'cat_name' ] = video[ 1 ]
vid[ video[ 7 ], 'cat_id' ] = video[ 7 ]

vid[ video[ 7 ], 'companies', video[ 14 ], 'comp_short_name' ] = video[ 5 ]

и т. Д., Это поможет? Ключом в этом случае будет кортеж (с двумя элементами в первых трех случаях, четырьмя элементами в четвертом), и я не уверен, как вы собираетесь это обрабатывать, но цикл с элементами для получения ключа и значения По сути, должно работать нормально.

0 голосов
/ 18 июня 2009

</p> <pre><code>{% for key, val in vid.items %} <h1>{{ val.cat_name }}</h1> {% for k2, v2 in val.companies.items %} <h2>{{ v2.comp_name }}</h2> <ul> {% for k3, v3 in v2.videos.items %} <li>{{ v3.vid_name }}</li> {% endfor %} </ul> {% endfor %} {% endfor %}

0 голосов
/ 18 июня 2009

Я тоже новичок в Django ...

Вы должны иметь возможность вкладывать циклы for, чтобы получить что-то вроде этого:

{% for key,val in dictionary.items %}
    {% for key,val in val.items %}

и т. Д.

...