Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中遍历多维字典_Python_Django_Django Models_Dictionary_Django Templates - Fatal编程技术网

Python 在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

在pythonland的第一天,我是一个PHP爱好者,试图将一个PHP站点转换为Python(学习体验),我很想得到一些建议。我从来没有想到使用你们pythoner所说的多维数组或字典会如此困难

所以我可以使用创建多维数组,但我不能在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_模型在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将起作用