Обход многомерного словаря в Джанго
-
06-07-2019 - |
Вопрос
Я в первый день в Python-стране являюсь парнем по 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>
Решение
Вы должны использовать встроенный ORM вместо использования своего собственные запросы (по крайней мере, для чего-то простого, подобного этому) значительно упрощают работу (при условии, что вы также создали свои модели в своем файле models.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 "
Другие советы
При переходе с одного языка или фреймворка на другой вы должны понимать, что обычно не стоит писать точно такой же код, даже если вы можете.
Например:
Я создаю свой словарь из SQL-запроса
Почему ты это делаешь? Способ представления объектов из базы данных в Django - использовать модель. Это позаботится о многих вещах для вас, включая SQL, но также поможет в переборе связанных таблиц.
Я тоже новичок в Django ...
Вы должны иметь возможность вкладывать циклы for, чтобы получить что-то вроде этого:
{% for key,val in dictionary.items %}
{% for key,val in val.items %}
и т. д.
Если вы создали сложный словарь следующим образом:
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 ]
и т. д., это поможет? Ключом в этом случае будет кортеж (с двумя элементами в первых трех случаях, четырьмя элементами в четвертом), и я не уверен, как вы относитесь к нему, но цикл с элементами для получения ключа и значения, По сути, должно работать нормально.
<код> код>
<код>{% 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 %}
Код> <код> код>