2011-08-12 113 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());