在Django中遍历多维字典

-1 投票
5 回答
4230 浏览
提问于 2025-04-15 12:19

我之前是做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 个回答

0

{% 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 %}

2

当你从一种编程语言或框架转到另一种时,你需要明白,照搬以前的写法通常不是个好主意,即使你可以这样做。

举个例子:

我正在通过一个sql查询来创建我的字典。

你为什么要这样做呢?在Django中,表示数据库中的对象应该使用模型。这样做可以帮你处理很多事情,包括SQL查询,同时也能方便你遍历相关的表。

3

你应该使用内置的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"

撰写回答