在Django中遍历多维字典
我之前是做PHP的,今天第一次接触Python,正在尝试把一个PHP网站转换成Python(算是学习一下),现在我很需要一些建议。我从没想过使用多维数组或者你们Python里叫的字典会这么难。
我可以用这个方法来创建多维数组,但在Django模板里我却无法循环使用它。这个方法不管用,我想如果能让它工作,我也许就能循环使用了。
{% for key,val in dictionary.items %}
看起来这个方法只适用于真正的字典,而不适用于我自定义的多维字典类。
我是在从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,但我也搞不明白。
如果有人能帮我实现我的目标,我将非常感激。希望我的问题表达得很清楚。
编辑:
当我在模板中完成循环后,它看起来是这样的……
<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 个回答
{% 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 %}
当你从一种编程语言或框架转到另一种时,你需要明白,照搬以前的写法通常不是个好主意,即使你可以这样做。
举个例子:
我正在通过一个sql查询来创建我的字典。
你为什么要这样做呢?在Django中,表示数据库中的对象应该使用模型。这样做可以帮你处理很多事情,包括SQL查询,同时也能方便你遍历相关的表。
你应该使用内置的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"