2016-11-28 59 views
0

如何获得项目的排序查询集以按字母顺序显示各部门中的团队还按字母顺序显示部门?Django查询集 - 排序两次

简单的模型是这样的...

class Department(models.Model): 
    name = models.CharField(max_length=50) 

class Teams(models.Model): 
    name = models.CharField(max_length=50) 
    dept = models.ForeignKeyField(Department, on_delete=CASCADE) 

    class Meta: 
     ordering = ('name',) 

class Project(models.Model): 
    name = models.CharField(max_length=50) 
    team = models.ForeignKeyField(Teams, on_delete=CASCADE) 

在Views.py我想收集团队和部门与项目每队人数按字母顺序显示出来。

... 
team_list = [] 
teams_ = Teams.objects.all().order_by('dept__name') 
for team in teams_: 
    projects = Project.objects.all(team=team) 
    team_list.append((team, len(projects))) 
return render(request, 'index.html', {'team_list': team_list}) 
模板

则...

<ul> 
{% for team, len in team_list %} 
<li><a href="{% url 'team_detail' team.id %}">{{ team.dept.name|upper }} - {{ team.name|capfirst }} ({{ len }})</a></li> 
{% endfor %} 
</ul> 

这会显示这样的事情...

Archive - Backup (22) 
Archive - Archive (3) 
Support - Glossary (32) 
Support - A Team (12) 
Support - Members (22) 

哪项不正确 - 我想和部门的有序字母列表像这样的球队......

Archive - Archive (3) 
Archive - Backup (22)  
Support - A Team (12) 
Support - Glossary (32) 
Support - Members (22) 
+1

'(“名”, 'dept')' – Sayse

回答

3

你并不需要使用Teams.objects.all(),只是ORDER_BY将工作同样精细:然后为了用逗号分开这些领域,像这样:

team_list = [] 
teams_ = Teams.objects.order_by('dept','name') 
for team in teams_: 
    projects = Project.objects.all(team=team) 
    team_list.append((team, len(projects))) 
return render(request, 'index.html', {'team_list': team_list}) 
+1

我会建议进行以下编辑:检索球队,比如'teams_ = Teams.objects.order_by('dept','name')。annotate(team_count = Count('projects'))',接下来是' team_list = [(x,x.team_count)for x in teams_]'。这样你可以在一个查询中得到它。 –