如何在Django模板中统计各公司的员工数量并展示?
统计公司员工数量并在Django模板展示
没问题,我给你梳理两种可行的方案,你可以根据实际情况选择:
方案一:模型方法直接统计(简单易实现,小数据量适用)
首先先把你的模型补全(注意ForeignKey的on_delete参数要写完整,我这里用CASCADE做示例),然后给Company模型加一个方法来直接获取对应员工数量:
# models.py from django.db import models from django.urls import reverse class Company(models.Model): name = models.CharField(max_length=100) desc = models.TextField(blank=True, null=True, default='Tidak ada deskripsi') def __str__(self): return self.name def get_absolute_url(self): return reverse("system:company_list") # 新增方法:统计当前公司的员工数 def employee_count(self): # employee_set是Django自动生成的反向关联属性 return self.employee_set.count() class Employee(models.Model): name = models.CharField(max_length=100) # 补全on_delete参数,这里用CASCADE表示删除公司时同步删除员工 # 如果不想删除员工,可以改成on_delete=models.SET_NULL,同时设置null=True company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True) def __str__(self): return self.name
然后在视图里直接传递所有公司对象到模板:
# views.py from django.shortcuts import render from .models import Company def company_list(request): companies = Company.objects.all() return render(request, 'system/company_list.html', {'companies': companies})
最后在模板里调用模型方法展示数据:
<!-- system/company_list.html --> <h1>公司列表</h1> <div class="company-container"> {% for company in companies %} <div class="company-card"> <h3>{{ company.name }}</h3> <p>员工数量:{{ company.employee_count }}</p> {% if company.desc %} <p>描述:{{ company.desc }}</p> {% endif %} </div> {% empty %} <p>暂无公司数据</p> {% endfor %} </div>
方案二:annotate聚合查询(性能更优,大数据量推荐)
如果你的公司数量较多,方案一的N+1查询会拖慢页面加载速度,这时候用Django的annotate做聚合查询更高效——一次SQL查询就能搞定所有统计:
视图部分:
# views.py from django.shortcuts import render from django.db.models import Count from .models import Company def company_list(request): # 用annotate给每个Company对象添加employee_count字段,统计关联的员工数 companies = Company.objects.annotate(employee_count=Count('employee')) return render(request, 'system/company_list.html', {'companies': companies})
模板部分和方案一完全一致:
<!-- system/company_list.html --> <h1>公司列表</h1> <div class="company-container"> {% for company in companies %} <div class="company-card"> <h3>{{ company.name }}</h3> <p>员工数量:{{ company.employee_count }}</p> {% if company.desc %} <p>描述:{{ company.desc }}</p> {% endif %} </div> {% empty %} <p>暂无公司数据</p> {% endfor %} </div>
这种方式只需要一次数据库查询就能拿到所有公司及其员工数量,比方案一的多次查询高效很多,推荐优先使用。
内容的提问来源于stack exchange,提问作者Dicky Raambo
相关产品推荐
相关产品推荐

