如何使用Django从一个查询中的多个表中进行选择?
问题描述:
我有两个表,一个“公司”和一个“雇员”:如何使用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)?或者应该忽略这种行为,缓存并考虑“优化”?
答
我想你要找的是什么你的查询集的select_related方法。 见the doc
select_related()
返回一个QuerySet会 自动“跟随”外键关系 ,选择当它 执行其查询 其他相关对象数据。这是一个 业绩助推器导致 (有时很)放大查询,但 意味着以后使用外键 关系,不需要数据库查询
答
这是一个老问题,让我提供新的答案。
其实,你可以这样做:
employees = Employee.objects.all().values('id','name','company__name')
然后,Django会自动查找公司类,并为您找到的公司名称。
在模板页面上使用{{employee.company__name}},那么它将正确显示公司名称。
我已经阅读了文件的上下,但设法完全错过了这部分。非常感谢!那很尴尬。 – tdolsen 2010-03-11 14:26:47