遍历django中的多维字典
-
06-07-2019 - |
题
我是第一天在Python-land中的PHP人,尝试将php网站转换为python(学习经验),我很伤心。我从没想过像pythoners所说的那样使用多维数组或字典会很难。
所以我可以使用这个,但我无法在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中复制已经证明是困难的。
我想也许我可以使用set_MODEL在django中进行向后查找,但我也无法解决这个问题。
如何实现我的目标的任何帮助将不胜感激。我希望我的问题很清楚
编辑:
当我在我的模板中完成循环时,它看起来像这样......
<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 %}
我没有测试过,但应该可以使用。将此代码与您在PHP或Python中不使用ORM时必须编写的代码进行比较。
看看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 ]
等等,会有帮助吗?在这种情况下,关键是一个元组(在前三个案例中有2个项目,在第四个案例中有4个项目),我不确定你是如何对待它的,但是要获得关键和值的项目循环,本身,应该工作正常。 <代码> 代码>
<代码>{% 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 %}
代码> <代码> 代码>