所以这个描述有点奇怪,请耐心等待:)尝试解释没有代码也没有多大意义所以这里有一个简短的例子:
class Employee(models.Model):
name = models.CharField(max_length=100)
class Location(models.Model):
address = models.CharField(max_length=200)
employees = models.ForeignKey(Employee)
class Company(models.Model):
name = models.CharField(max_length=100)
locations = models.ForeignKey(Location)
假设我们想通过模板打印出特定公司的每位员工。通常我们会这样做:
{% for location in company.locations.all %}
{% for employee in location.employees.all %}
{{ employee.name }} <br/>
{% endfor %}
{% endfor %}
哪个方面效果很好,但在这种情况下,如果有员工,我想在员工名单的顶部打印一个标题,但如果没有员工,请留下标题。在典型的循环中,我使用forloop.first
来表示应该显示标题,但在这种情况下我不能。如果我在外部循环(位置)中尝试它,当没有员工在场时,我可能会得到一个标题,如果我在内部循环中尝试它(员工)我将只获得有员工的位置的标题,但我会得到每个位置一个标题,而不是整个列表中的一个标题。
现在,我理想的解决方案是跳过一个步骤,并从公司层面迭代所有员工:
{% for employee in company.employees %}...{% endfor %}
公司级别的employees
基本上是每个位置的员工查询集的串联。我查看了自定义管理器,但我不确定如何在这种情况下使用它们。
希望这有点道理。谢谢你的任何建议!
答案 0 :(得分:4)
您可以反过来查询(在视图中)获取公司所有员工的单个查询集:
employees = Employee.objects.filter(location__company=company)
这样做的好处是只需要一个数据库命中,而不是每个位置一个。