2011-08-12 14 views
3

カスタム注文方式を使用して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 

結果を年に並べ替えたいと思います。

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

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

クエリセットを作成する文の中で、この順序のいずれかを達成する方法はあります:次のような結果と

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

:SQLでは、これはこのように表現されるだろう

またはテンプレートのregroup声明では?

答えて

0

あなたは、たとえば、によって注文する必要がある値を作成するために余分なクエリセットを使用することができます。yourmodule_schoolチームの外部キーを持っている必要があり、データベース内のテーブルでなければなりません

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") 

を。

django.db.connectionをインポートしてqueryを実行していることを確認して、connection.queriesを実行すると、select_related(depth = 1)のおかげでジョインが実行されます。 school_idが学校という名前の外部キーである必要があり

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") 

:いくつかの不必要なしにこれを行うための別の方法は、あなたが持っている場合は、モジュールに複数の外部キーが、このような余分なフィールド上のSELECTクエリを実行することです参加しますあなたのチームクラスで。

このようにして、クエリはselectの新しい値を作成します。この値は、順序付けに使用できます。 hereは、ちょうどの場合のextra()のドキュメントです。

+0

ご提案をいただき、ありがとうございます。しかし、 'school_year'はSeasonモデルのフィールドで、チームモデルと外部キーとして関連付けられています。外部キーに '.extra()'を使用する方法はありますか? –

+0

私はちょうど私の応答を更新しました。 – Hassek

0

は、このようなあなたの再グループタグにdictsortを追加:{% regroup teams_at_school|dictsort:"school_year" by season.school_year as teams %}以下タグのためにチームの辞書の並べ替えを削除します。今後のない実行可能なサーバー側のソリューションで

+0

ありがとうございます。'school_year'は' Team'のプロパティではなく、外部キー関連のオブジェクト 'Season'のプロパティであるため、このようにあなたの提案を実装しました:' {%regroup teams_at_school | dictsort:season.school_year by season .school_year as teams%} '。これはチームの順序を変更するようには見えませんが、それは不思議なことに、2つの学年の重複を引き起こします。上記の3つの学年の代わりに、私は今5つ(重複2つ)を持っています。 –

0

は、私はjQueryの経由でリストを並べ替え、クライアント側のソリューションに頼っ:

$("#sport-picker > li.first").after($("#sport-picker").find("li > span:contains('2011-2012')").parent());