Лучший способ нарезать набор запросов Django, не обращаясь к базе данных более одного раза - PullRequest
6 голосов
/ 25 февраля 2012

Я выполняю запрос, чтобы получить 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 ]

10 голосов
/ 25 февраля 2012

Преобразовать в последовательность в представлении, затем нарезать последовательность.

var = list(somequery[:5])
6 голосов
/ 25 февраля 2012

Вам просто нужно заставить набор запросов оценивать себя перед срезом.Это может быть сделано так же просто, как вызов len() в вашем представлении перед передачей его контексту.

Документация Django имеет полный список всего, что заставляет набор запросов оценивать .Просто сделай что-нибудь из этого списка, и ты в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...