2010-11-26 70 views
1

那么这个人是有点古怪来形容了,请多多包涵:)尝试无码解释将没有多大意义,所以这里有一个简单的例子:的Django“CONCAT”查询设置

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在公司层面实质上是一个级联为每个位置设置的员工查询。我研究过自定义管理器,但我不确定如何在这种情况下使用它们。

希望这是有道理的。感谢您的任何建议!

回答

4

你可以做的查询(视图)反过来想获得公司全体员工的一个查询集:

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

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

+0

谢谢!在写完这个问题后大约2分钟,这实际上发生在我身上,我刚才一直在向后看我想的问题!另外一个注意事项,在我的例子中,我实际上将它作为一个函数添加到了我的Model类中,这可以让我完全按照上面在模板(`company.employees`)中所述的方式调用它。 – Toji 2010-11-26 17:28:31