我有两张桌子,一张是“公司”,另一张是“员工”:
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)?或者是否应忽略此行为,缓存并将其视为“优化”?
答案 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])