如何使用Django从一个查询中选择多个表?

时间:2010-03-11 14:17:04

标签: python django join django-queryset

我有两张桌子,一张是“公司”,另一张是“员工”:

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

相反,我希望最初在获取Employees的同一查询中进行此连接。像这样:

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

这是否可以使用Django QuerySet?如果没有,有没有办法解决这个问题(没有原始的sql)?或者是否应忽略此行为,缓存并将其视为“优化”?

4 个答案:

答案 0 :(得分:22)

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

Employee.objects.select_related()

答案 1 :(得分:7)

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

  

select_related()

     

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

答案 2 :(得分:6)

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

实际上,你可以这样做:

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

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

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

答案 3 :(得分:0)

使用原始查询

    qry1 = "SELECT c.car_name, p.p_amount FROM pay p, cars c where p.user_id=%s;"

    cars = Cars.objects.raw(qry1, [user_id])