2014-09-07 2 views
0

Я пытаюсь использовать ListView для отображения всех моих городов.Как подсчитать объекты, связанные с элементом, отображаемым в ListView?

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

Models.py

class Town(models.Model): 
    name = models.CharField() 

class Citizen(models.Model): 
    name = models.CharField() 
    town = models.ForeignKey(Town) 

Views.py

class TownView(ListView): 
    model = Town 
    def get_context_data(self, **kwargs): 
     context = super(TownView, self).get_context_data(**kwargs) 
     context['towns'] = Town.objects.all().prefetch_related('players') 
     return context 

Это не работает, потому что prefetch_related будет работать только тогда, когда я там был атрибут игрок с точки зрения города, возможно, через многоtomany поле.

Как я могу получить для каждого города количество граждан, у которых есть предки для этого города?

Кроме того, как бы выглядел бы мой шаблон? В настоящее время, это выглядит следующим образом:

Шаблон
<table> 
{% for town in open_towns %} 
    <tr> 
     <td><a href="/town/join/{{ town.slug }}/">{{ town.name }}</a></td> 
     <td>population : {{ Player.objects.filter(town=town).count() }}</td> 
    </tr> 
{% endfor %} 
</table> 

Но это, очевидно, тоже неправильно.

ответ

2

Похоже annotate функциональность, что вам нужно:

Town.objects.annotate(population=Count('players')) 

И в шаблоне:

<table> 
{% for town in open_towns %} 
    <tr> 
     <td><a href="/town/join/{{ town.slug }}/">{{ town.name }}</a></td> 
     <td>population : {{ town.population }}</td> 
    </tr> 
{% endfor %} 
</table> 
3

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

from django.db.models import Count 

class TownView(ListView): 
    queryset = Town.objects.all().annotate(citizen_count=Count('citizen')) 

Теперь каждый элемент object_list имеет citizen_count свойство.