如何在Django首页按公司分组展示员工姓名列表?
解决Django中按公司分组展示员工的问题
1. 修正模型关联关系
你当前的模型外键方向错误,导致一个公司只能关联单个员工。正确的关联应该是一个公司对应多个员工,调整后的模型代码如下:
# models.py class Company(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Employee(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) comment = models.TextField() # 添加指向Company的外键,关联公司与员工 company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name="employees", blank=True, null=True) def __str__(self): return f"{self.first_name} {self.last_name}"
related_name="employees"允许通过company.employees直接获取该公司下的所有员工blank=True, null=True支持员工暂时不关联公司(对应你示例中的None)
2. 执行数据库迁移
修改模型后,需要更新数据库:
python manage.py makemigrations python manage.py migrate
3. 调整视图逻辑
在视图中获取所有公司,并预加载对应员工数据(避免N+1查询问题):
# views.py from django.shortcuts import render from .models import Company def companies_view(request): # 预加载每个公司的员工 companies = Company.objects.prefetch_related('employees').all() return render(request, 'your_template_name.html', {'companies': companies})
4. 编写模板展示分组数据
在模板中遍历公司,按要求展示公司名和对应的员工列表:
<!-- templates/your_template_name.html --> {% for company in companies %} <p> {{ company.name }} [ {% for employee in company.employees %} {{ employee.first_name }}{% if not forloop.last %}, {% endif %} {% empty %} None {% endfor %} ] </p> {% endfor %}
- 若公司无员工,会显示
None;有员工则按逗号分隔展示姓名 - 最终效果示例:
Apple [Jessica, Matthew, Anthony],无员工时显示Apple [None]
内容的提问来源于stack exchange,提问作者Krima Trivedi
相关产品推荐
相关产品推荐

