切片Django查询集而不会多次访问数据库的最佳方法

时间:2012-02-25 18:57:21

标签: django

我正在运行查询以获取5个最新的News项。在我的模板中,我想在一个位置显示第一个项目,然后在页面下方显示剩余的4个项目。

在我的模板中,我做了类似的事情:

{% 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的智能方式,只是请求你实际使用的东西,但在这种情况下,它似乎有点过分。做这种事的最好方法是什么?

2 个答案:

答案 0 :(得分:10)

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

var = list(somequery[:5])

答案 1 :(得分:6)

您只需要强制查询集在切片之前评估自己。这可以像在视图中调用len()一样简单地完成,然后再将其传递给上下文。

Django文档有一个complete list of everything that causes a queryset to evaluate。只需从该列表中做一些事情就可以了。