代码之家  ›  专栏  ›  技术社区  ›  Toji

Django“concat”查询集

  •  1
  • Toji  · 技术社区  · 14 年前

    所以这个描述有点奇怪,请容忍我:)试图在没有代码的情况下解释是没有意义的,所以这里有一个简单的例子:

    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 回复  |  直到 14 年前
        1
  •  4
  •   Daniel Roseman    14 年前

    您可以通过另一种方式(在视图中)进行查询,以获得公司所有员工的单个queryset:

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

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