В WORDPRESS:
global $wpdb; $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
var_dump( $column_name );
}
Запросы к базе данных Django обрабатываются лениво, поэтому результат thread.comment_set .all
- это QuerySet, а не список. QuerySet поддерживает множество функций, подобных списку, но не отрицательное срезы, поэтому ошибка индексирования не исходит от самого фильтра шаблона. (Если вам интересно, срезы объектов QuerySet преобразуются в предложение limit
в операторе SQL, вот почему вы не можете использовать отрицательное число).
В общем, Django поощряет строгое разделение шаблонов и моделей; модуль views.py
- это связующее звено, на котором вы выполняете любую работу, требующую знания моделей баз данных и методов набора запросов для преобразования данных вашей модели в простые переменные и структуры для шаблона.
Выполнение связанного запроса к модели из шаблона - это не то, что вы обычно видите в шаблоне Django, и для этого есть веская причина. Прямо сейчас может показаться очень простым вырезать последние три элемента из comment_set. Однако имейте в виду, что база данных не будет возвращать результаты ни в каком гарантированном порядке. Это означает, что в дополнение к вашему фрагменту теперь вам также необходимо добавить предложение order_by; просто нет способа выразить это в шаблоне, да и быть не должно. Лучше думать о представлении как о переводе между вашей моделью и шаблоном и позволять выполнять такую работу с базой данных там, а не встраивать в HTML.
В этом случае я бы посоветовал вам передать упорядоченный фрагмент в ваш шаблон из представления:
# take first three sorted descending
comments = thread.comment_set.order_by('-something')[:3]
context = Context({'comments':comments})
return HttpResponse(tmplt.render(context))
Если вам необходимо выполнить нарезку в шаблоне, и вы действительно не заботитесь о сортировке результатов, передайте список в шаблон. Фильтр slice
с радостью выполнит отрицательное срезы:
comments = list(thread.comment_set.all())
context = Context('comments':comments)
В шаблоне:
{% for comment in comments|slice:"-3:" %}
Используйте атрибут «ordering» класса Meta класса Comment, чтобы установить требуемый порядок элементов.
Шаблоны IMO - не подходящее место для упорядочивания набора данных. Заказ следует оформлять либо в моделях, либо в видах.
Я не видел, чтобы фильтр dictsortreversed использовался слишком часто, и, согласно документам, для сортировки требуется ключ автор
{% for comment in thread.comment_set.all|dictsortreversed:"name"|slice:"3" %}
Разве вы не можете просто разрезать список перед тем, как передать его в шаблон?