Python 在django中遍历多维字典
在pythonland的第一天,我是一个PHP爱好者,试图将一个PHP站点转换为Python(学习体验),我很想得到一些建议。我从来没有想到使用你们pythoner所说的多维数组或字典会如此困难 所以我可以使用创建多维数组,但我不能在django模板中循环它。不起作用,但我想如果我能让它起作用,我就无法循环Python 在django中遍历多维字典,python,django,django-models,dictionary,django-templates,Python,Django,Django Models,Dictionary,Django Templates,在pythonland的第一天,我是一个PHP爱好者,试图将一个PHP站点转换为Python(学习体验),我很想得到一些建议。我从来没有想到使用你们pythoner所说的多维数组或字典会如此困难 所以我可以使用创建多维数组,但我不能在django模板中循环它。不起作用,但我想如果我能让它起作用,我就无法循环 {% for key,val in dictionary.items %} 似乎只适用于实际字典,而不适用于custon多维字典类 我正在从sql查询创建字典: vid[ video[ 7
{% 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_模型在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>
类别
公司
- 录像带
公司
- 录像带
- 录像带
类别
公司
- 录像带
公司
- 录像带
- 录像带
我也是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 %}
{%用于键,val位于vid.items%}
{{val.cat_name}
{对于k2,在val.companys.items%中为%v2}
{{v2.comp_name}
{v2.videos.items%}
- {{v3.vid_name}
{%endfor%}
{%endfor%}
{%endfor%}
当从一种语言或框架转换到另一种语言或框架时,您需要意识到,用完全相同的方式编写代码通常不是一个好主意,即使可以
例如:
我正在从sql查询创建字典
你为什么这么做?在Django中表示数据库中的对象的方法是使用模型。这将为您解决很多问题,包括SQL,但也有助于迭代相关表。您应该使用内置查询,而不是使用自己的查询(至少对于这样简单的查询),这会使事情变得更简单(假设您也在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 %}
{%用于类别中的类别%}
{{category.name}
{category.company_set.all%}
{{company.name}
{%用于company.video_set.all%中的视频}
- {{video.name}
{%endfor%}
{%endfor%}
{%endfor%}
我还没有测试过,但应该可以用。将此代码与在PHP或Python中不使用ORM时必须编写的代码进行比较
看一看django文档了解更多信息,我建议花几个小时做这些工作
更新:修改代码使用“\u set.all”这不起作用,我设置了外部循环来测试它。它一点也不循环。我必须循环浏览所有类别并打印出其类别中的每个公司,然后循环浏览公司并打印出其公司中的每个视频。我看不出用那种方法做那件事的方法。我将更新我的问题来说明这一点。您在编辑中显示的内容是您所说的它的外观,还是您希望它的外观?就上面复杂的Python代码而言,您的类别、公司和视频是什么?对不起,我希望它是什么样子。我会编辑代码使其更易于阅读。显然,这种循环不适用于多维字典。我已经试过了,还有它的变体。这很奇怪,因为我已经运行了它,并且得到了你想要的。显示在此模板上运行dict的结果。{%for key,val in videos.items%}{{val.name}{%endfor%}甚至不起作用。请仔细阅读。我写了“v2.videos.items”。+1:放弃PHP isms,按照使用Django的方式使用它。这是我尝试的第一件事。它不起作用。公司不起作用。类别与公司没有链接。公司拥有类别的外键。我试过使用company.set\u category,但在django模板中显然无法做到这一点——这就是关键所在。你可能需要category.company\u set。如果你有问题,发布你的代码(可能在另一个问题中),我们可以看一下。是的,很抱歉,你需要company\u set…我的观点是,你不需要多维字典,使用ORM非常简单。我解决了我的问题。我在模板中使用category.company\u set.all(),但出现了一个错误。移除()使一切正常。thanksI尝试使用内置的模型函数来实现它,但我得出的结论是它不起作用,但您没有说明原因。肯定会的,我一直都这么做。这是我第一次尝试。它不起作用。公司不起作用。类别与公司没有链接。公司拥有类别的外键。我尝试过使用company.set_category,但在django模板中无法做到这一点。显然,将相关的_name='companys'放在FK定义中,然后category.companys将起作用