【问题标题】:Traversing multi-dimensional dictionary in django在 django 中遍历多维字典
【发布时间】:2010-11-03 21:28:53
【问题描述】:

我在 Python 领域的第一天是一名 PHP 人,试图将一个 php 网站转换为 python(学习经验),但我正在寻求建议。我从没想过使用多维数组或字典会如此困难,就像你们 Python 人所说的那样。

所以我可以使用this 创建多维数组,但我不能在 django 模板中循环它。 this 不起作用,但我想如果我能让它工作,我无法循环通过它。

{% 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 中复制已被证明是困难的。

我想也许我可以使用 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>

【问题讨论】:

  • 您在编辑中显示的内容是您所说的,还是您希望它看起来的样子?就上述复杂的 Python 代码而言,您拥有的类别、公司和视频是什么?
  • 对不起,我希望它看起来像什么。我将编辑代码以使其更易于阅读。

标签: python django django-models dictionary django-templates


【解决方案1】:

您应该使用内置的 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 文档以获取更多信息,我建议您花几个小时完成tutorial

更新:修改代码以使用“_set.all”

【讨论】:

  • +1: 放弃 PHP-isms 并按照 Django 本来的方式使用它。
  • 这是我尝试的第一件事。它不起作用。 category.companies 不起作用。类别与公司没有链接。公司具有类别的外键。我尝试使用 company.set_category,但显然你不能在 django 模板中这样做
  • 当然可以——这就是重点。您可能需要 category.company_set.all 如果您遇到问题,请发布您的代码(可能在另一个问题中),我们可以看看。
  • 是的,很抱歉,您需要 company_set...我的意思是您不需要多维字典,使用 ORM 更简单
  • 我发现了我的问题。我在我的模板中使用了 category.company_set.all() 并且出现了错误。删除 () 使一切正常。谢谢
【解决方案2】:

从一种语言或框架迁移到另一种语言或框架时,您需要意识到以完全相同的方式编写代码通常不是一个好主意,即使可以。

例如:

我正在从 sql 查询创建我的字典

你为什么要这样做?在 Django 中表示来自数据库的对象的方法是使用模型。这将为您处理很多事情,包括 SQL,但也有助于遍历相关表。

【讨论】:

  • 我尝试使用内置的模型函数来做到这一点,但我得出的结论是它不起作用
  • 但你没有说为什么。肯定会的,我一直都这样做。
  • 这是我尝试的第一件事。它不起作用。 category.companies 不起作用。类别与公司没有链接。公司具有类别的外键。我尝试使用 company.set_category,但显然你不能在 django 模板中这样做
  • 将related_name='companies' 放入FK 定义中,然后category.companies 将起作用
【解决方案3】:

我也是 Django 初学者...

您应该能够嵌套 for 循环以获得如下内容:

{% for key,val in dictionary.items %}
    {% for key,val in val.items %}

等等。

【讨论】:

  • 这不起作用,我设置了外部循环来测试它。它根本不循环。
【解决方案4】:

如果您按照以下方式构建复杂的字典:

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 个项目),我不确定你的意思是如何对待它,但是项目上的循环以获取键和值,就其本身而言,应该可以正常工作。

【讨论】:

  • 我必须遍历所有类别并打印出其类别中的每个公司,然后遍历公司并打印出其公司中的每个视频。我看不到使用该方法的方法。我会更新我的问题来说明这一点。
【解决方案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 %}

【讨论】:

  • 该循环显然不适用于多维字典。我已经尝试过,以及它的变体。
  • 这很奇怪,因为我已经运行它并且得到了你想要的。显示在此模板上运行 dict 的结果。
  • {% for key, val in videos.items %}

    {{ val.name }}

    {% endfor %} 这甚至不起作用
  • 请仔细阅读。我写了“v2.videos.items”。
猜你喜欢
  • 2011-04-21
  • 2012-07-01
  • 1970-01-01
  • 2018-05-24
  • 2011-12-22
  • 2014-07-19
  • 2017-05-23
  • 1970-01-01
  • 2014-03-27
相关资源
最近更新 更多