Django“concat”查询集

时间:2010-11-26 16:48:15

标签: django django-queryset

所以这个描述有点奇怪,请耐心等待:)尝试解释没有代码也没有多大意义所以这里有一个简短的例子:

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基本上是每个位置的员工查询集的串联。我查看了自定义管理器,但我不确定如何在这种情况下使用它们。

希望这有点道理。谢谢你的任何建议!

1 个答案:

答案 0 :(得分:4)

您可以反过来查询(在视图中)获取公司所有员工的单个查询集:

employees = Employee.objects.filter(location__company=company)

这样做的好处是只需要一个数据库命中,而不是每个位置一个。