避免在Django模板中进行第二次迭代

时间:2011-11-18 18:22:04

标签: django django-templates

我在视图中创建了一个QuerySet。我需要对其中一个字段执行某些操作(准确地将其解析为字典)。所以,我遍历QuerySet来进行解析。然后,我接受我的新对象(无论它将是什么),并将其传递给模板。然后,模板必须遍历对象......基本上是相同信息的2次迭代。

这是我的观看代码:

t = Transaction.objects.values()
for r in t:
    r['data'] = dict([z.split(':',1) for z in r['data'].split('|')])

...当然,我将新的和改进的't'传递给模板,在这种情况下会发生这样的事情:

{% for r in t %}
    <tr>
    <td>{{ r.username }}</td><td>{{ r.source }}</td><td>{{ r.trans }}</td><td>{{ r.transtime }}</td>
    <td>
    {% for k,v in r.data.items %}
        {{ k }}: {{v}}<br>
    {% endfor %}
    </td>
    </tr>
{% endfor %}

在意大利面条代码的老派时代,这不是问题。我只是遍历数据,对于每个记录,我将解析并显示我需要的内容......

所以这是我的问题:在django-world中,如何避免两次循环我的数据?这在Python世界中是“好的”,还是有更好的方法?谢谢!

2 个答案:

答案 0 :(得分:1)

如果没有更具体的例子,很难真正理解你的需求,但通常可以通过将查询集对象包装在生成器中的视图传递给延迟处理来解决这个问题。

答案 1 :(得分:0)

在同一个迭代中循环两次没有必然“错误”。有时,这可能是必要的,如果没有示例代码,就无法确定它是否存在。

重要的是它实际上并没有两次查询数据库。 Django缓存查询集,但是与它进行交互的方式有时会导致额外的查询。但是,如果没有示例代码,我不能说你是否有问题。

更新您所做的事情没有任何问题,如果查询集需要额外的处理,那么正确的地方就是在视图中。在模板中循环新的和改进的版本不是问题,并且数据库没有被冗余查询命中。我说停止担心这么多;)