Skip to main content
 首页 » 编程设计

python之如何统计与ListView中显示的项目相关的对象

2025年05月04日17zhujiabin

我正在尝试使用 ListView 来显示我所有的城镇。

但是,我想显示每个城镇的居民人数。

模型.py

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

View .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 只有在城镇 View 中有玩家属性时才有效,也许是通过 manytomany 字段。

如何为每个城镇检索将外键设置为该城镇的公民数量?

此外,我的模板会是什么样子?目前,它看起来像这样:

模板

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

但这显然也是错误的。

请您参考如下方法:

你真正需要的是注解。您完全可以在不覆盖任何方法的情况下执行此操作。

from django.db.models import Count 
 
class TownView(ListView): 
    queryset = Town.objects.all().annotate(citizen_count=Count('citizen')) 

现在 object_list 中的每个元素都有一个 citizen_count 属性。