Пользовательский заказ на перегруппировку - PullRequest
3 голосов
/ 13 августа 2011

Я бы хотел переупорядочить набор запросов в шаблоне Django, используя собственную схему заказа.

Это код шаблона:

{% regroup teams_at_school by season.school_year as teams %}
    <ul id="sport-picker">
        <li class="first"><span>Sports by year</span></li>
            {% for team_grouper in teams|dictsort:"season__school_year" %}
            <li><span>{{ team_grouper.grouper }}<img src="http://hometeam.s3.amazonaws.com/graphics/down-pointer.png"></span>
                <ul class="dropper">
                    {% for team_list in team_grouper.list|dictsort:"sport.sport" %}
                    <li><a href="{{ team_list.season.season_start_date.year }}/{{ team_list.sport.sport_slug }}/">{{ team_list.sport }} {% if team_list.total_wins > 0 or team_list.total_losses > 0 %}({{ team_list.total_wins }}-{{ team_list.total_losses }}){% endif %}</a></li>
                    {% endfor %}
                </ul>
            </li>
            {% endfor %}
    </ul>

, который производит этот вывод:

School years with incorrect ordering


Как видите, порядок учебного года не идеален. Данные отображаются в базе данных следующим образом:

 id | school_year 
----+-------------
  1 | 2010-2011
  2 | 2009-2010
  3 | 2011-2012

Я хотел бы изменить порядок результатов по годам. В SQL это можно выразить так:

select * from seasons_schoolyear order by substring(school_year from 1 for 4);

со следующим результатом:

 id | school_year 
----+-------------
  2 | 2009-2010
  1 | 2010-2011
  3 | 2011-2012

Есть ли способ достичь этого порядка в инструкции, которая создает набор запросов:

teams_at_school = Team.objects.filter(school=team).order_by('season__school_year')

или в выражении regroup шаблона?

Ответы [ 3 ]

1 голос
/ 15 августа 2011

Добавьте dictsort к вашему тегу перегруппировки следующим образом: {% regroup teams_at_school|dictsort:"school_year" by season.school_year as teams %} и удалите сортировку dict из team ниже для tag.

0 голосов
/ 06 сентября 2011

Поскольку не было готового решения на стороне сервера, я прибегнул к решению на стороне клиента, переупорядочив список через jQuery:

$( "#sport-picker > li.first" ).after( $( "#sport-picker" ).find( "li > span:contains('2011-2012')" ).parent() );
0 голосов
/ 13 августа 2011

Вы можете использовать дополнительный набор запросов для создания значения, которое необходимо упорядочить, например:

Team.objects.filter(school=team).select_related(depth=1)
    extra(select={"first_year":"SUBSTRING(yourmodule_school.year from 1 for 4)"}).
    order_by("-first_year")

Где yourmodule_school должна быть таблицей в вашей базе данных, которая должна иметь внешний ключ в Team.

Вы можете проверить, выполняет ли запрос то, что вы ожидаете, используя импорт django.db.connection и выполняя connection.queries, он будет выполнять соединения благодаря select_related (deep = 1).Другой способ сделать это без каких-либо ненужных объединений, если у вас есть более одного внешнего ключа в модуле, это сделать запрос SELECT для дополнительного поля, например:

Team.objects.filter(school=team).
    extra(select={"first_year":"SELECT SUBSTRING(year from 1 for 4)
    FROM yourmodule_school WHERE id=school_id"}).
    order_by("-first_year")

, где school_id должен быть внешним ключомименованная школа в классе вашей команды.

Таким образом, запрос создает новое значение для выбора, которое можно использовать для упорядочивания. здесь - это документация о extra () на всякий случай.

...