2011-08-12 146 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 

我想重新按年排序結果。在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聲明中?

回答

0

您可以使用額外的查詢集來創建你需要按值,例如:

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應該在你的數據庫中的表,有可能對球隊的外鍵。

您可以通過導入django.db.connection並執行connection.queries來檢查查詢是否符合您的期望,由於select_related(depth = 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") 

其中學校ID應該是一個外鍵命名的學校在你的團隊課上。

這樣查詢會爲可用於排序的選擇創建一個新值。爲了以防萬一,here是extra()的文檔。

+0

謝謝您的建議。但是,'school_year'是Season模型中的一個字段,它與Team模型作爲外鍵相關聯。有沒有辦法使用'.extra()'與外鍵? –

+0

我剛更新了我的回覆。 – Hassek

0

添加dictsort您重新組合的標籤是這樣的:{% regroup teams_at_school|dictsort:"school_year" by season.school_year as teams %}和刪除的字典排序如下標籤。

+0

謝謝你的建議。我實現了這樣的建議(因爲'school_year'是外鍵關聯對象'Season'的屬性而不是'Team'的屬性):{按季節{%regroup teams_at_school | dictsort:「season.school_year」 .school_year as teams%}'。這似乎並沒有對團隊重新排序,但奇怪的是,這導致了兩個學年的重複。現在我有五個(有兩個副本),而不是上面列出的三個學年。 –

0

一個可行的服務器端解決方案沒有着落,我使出了客戶端解決方案,通過jQuery重新排序列表:

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