2012-02-25 35 views
5

我正在运行查询以获取5个最新的News项目。在我的模板中,我想在一个位置显示第一个项目,然后在页面的另一个位置显示剩余的四个项目。切入Django查询集而不触及数据库的最佳方式

在我的模板,我做这样的事情:

{% for n in news|slice:":1" %} 
    {{ n.headline }} 
{% endfor %} 

... more HTML ... 

{% for n in news|slice:"1:" %} 
    {{ n.headline }} 
{% endfor %} 

当我看到在调试工具栏,这将导致两个数据库查询:一个LIMIT 1,另一个为LIMIT 4 OFFSET 1,但在其他方面一样。我很欣赏这是Django智能地只请求你实际使用的东西的方式,但在这种情况下,它似乎有点过分。做这种事最好的办法是什么?

+0

从程序员的角度来看,您肯定会调用一次'for'循环两次,并且它们都被设置为调用查询的模板。你可以一次抓住所有5个,将它存储在客户端,并显示缓存副本的内容,而不是? – Droogans 2012-02-25 19:02:26

+0

好吧,这就是我想要做的。在视图中,我抓取所有5个,但是查询集只在我尝试切割第一个时进行评估。然而,第一个for循环并不需要是循环,因为它只有1个项目。 – 2012-02-25 19:04:20

回答

9

转换为视图中的序列,然后切片序列。

var = list(somequery[:5]) 
+0

你的意思是''var = list(somequery)[:5]''? – 2012-05-29 22:10:12

+4

@Riley:不是。它检索所有*记录,然后切片前5个,而我写的检索前5个,并让模板切片。 – 2012-05-29 22:17:08

+0

啊,我明白你的意思了。我认为这个措词让我失望了。 – 2012-05-30 01:29:24

相关问题