2010-03-11 62 views
7

我有两个表,一个“公司”和一个“雇员”:如何使用Django从一个查询中的多个表中进行选择?

class Company(models.Model): 
    name = models.CharField(max_length=60) 

class Employee(models.Model): 
    name = models.CharField(max_length=60) 
    company = models.ForeignField(Company) 

我想列出表中的每一位员工,在公司旁边。通过调用employees = Employee.objects.all()并在模板循环中调用{{employee.company.name}},这很简单。

这个解决方案的问题是它将为循环中的每个项目创建一个新的查询。因此,为每个员工都会有一个查询公司看起来像这样:

SELECT `company`.`id`, `company`.`name` 
FROM `company` 
WHERE `company`.`id` = 1 # This will of course be the employee.company_id 

相反,我希望把它作为最初加入同一个查询得到员工。类似这样的:

SELECT `employee`.`name` AS `name`, 
     `company`.`name` AS `company_name` 
FROM `employee` INNER JOIN `company` ON `employee`.`company_id` = `company`.`id` 

Django QuerySet可以吗?如果没有,是否有办法解决这个问题(没有原始的sql)?或者应该忽略这种行为,缓存并考虑“优化”?

回答

22

使用select_related()将预填充相应的属性:

Employee.objects.select_related() 
+0

我已经阅读了文件的上下,但设法完全错过了这部分。非常感谢!那很尴尬。 – tdolsen 2010-03-11 14:26:47

7

我想你要找的是什么你的查询集的select_related方法。 见the doc

select_related()

返回一个QuerySet会 自动“跟随”外键关系 ,选择当它 执行其查询 其他相关对象数据。这是一个 业绩助推器导致 (有时很)放大查询,但 意味着以后使用外键 关系,不需要数据库查询

0

这是一个老问题,让我提供新的答案。

其实,你可以这样做:

employees = Employee.objects.all().values('id','name','company__name') 

然后,Django会自动查找公司类,并为您找到的公司名称。

在模板页面上使用{{employee.company__name}},那么它将正确显示公司名称。

相关问题