tdo*_*sen 11 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)
Run Code Online (Sandbox Code Playgroud)
我想在表格中列出每个员工,旁边有公司.这很简单,通过调用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
Run Code Online (Sandbox Code Playgroud)
相反,我希望最初在获取Employees的同一查询中进行此连接.像这样的东西:
SELECT `employee`.`name` AS `name`,
`company`.`name` AS `company_name`
FROM `employee` INNER JOIN `company` ON `employee`.`company_id` = `company`.`id`
Run Code Online (Sandbox Code Playgroud)
这是否可以使用Django QuerySet?如果没有,有没有办法解决这个问题(没有原始的sql)?或者是否应忽略此行为,缓存并将其视为"优化"?
Ign*_*ams 24
使用 select_related() 将预先填充适当的属性:
Employee.objects.select_related()
Run Code Online (Sandbox Code Playgroud)
这是一个老问题,让我提供一个新的答案.
实际上,你可以这样做:
employees = Employee.objects.all().values('id','name','company__name')
Run Code Online (Sandbox Code Playgroud)
然后,Django将自动查找Company类并为您找到公司名称.
在模板页面上,使用{{employee.company__name}}然后它将正确显示公司名称.
| 归档时间: |
|
| 查看次数: |
30076 次 |
| 最近记录: |