我正在尝试使用 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
属性。
关于python - 如何统计与ListView中显示的项目相关的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713542/