如何使用 Django 在查询中加入 3 个表
Posted
技术标签:
【中文标题】如何使用 Django 在查询中加入 3 个表【英文标题】:How to join 3 tables in query with Django 【发布时间】:2017-10-02 00:00:39 【问题描述】:models.py
class Employee(models.Model):
emp_no = models.IntegerField(primary_key=True)
first_name = ...
last_name = ...
# emp_no first_name last_name
------ ---------- ----------
10005 Christian Erde
class DeptEmp(models.Model):
emp_no = models.ForeignKey(Employee, on_delete=models.CASCADE)
dept_no = models.ForeignKey(Department, on_delete=models.CASCADE)
# dept_no_id emp_no_id
---------- ----------
d003 10005
class Department(models.Model):
dept_no = models.CharField(primary_key=True, max_length=4)
dept_name = models.CharField(unique=True, max_length=40)
# dept_no dept_name
---------- ---------------
d003 Human Resources
views.py
class EmpList(ListView):
queryset = Employee.objects.all().select_related('deptemp').select_related('department')
employee_list.html
% for emp in object_list %
emp.first_name
emp.last_name
emp.department.dept_name
% endfor %
我在浏览器上收到此错误消息:无效的字段名称 在 select_related 中给出:'deptemp'、'department'。选项有:(无)
【问题讨论】:
什么是员工?模板中的部门是什么? 我认为您正在寻找 ManyToManyField (docs.djangoproject.com/en/dev/ref/models/fields/…)。这会在数据库上创建一个与您的 DeptEmp 模型类似的中间表。 @karthikr,感谢您指出这一点。我纠正了它。请查看我编辑的模板文件。 【参考方案1】:“选择相关”
返回将“遵循”外键关系的 QuerySet。
from django.db import models
class City(models.Model):
# ...
pass
class Person(models.Model):
# ...
hometown = models.ForeignKey(
City,
on_delete=models.SET_NULL,
blank=True,
null=True,
)
class Book(models.Model):
# ...
author = models.ForeignKey(Person, on_delete=models.CASCADE)
然后调用 Book.objects.select_related('author__hometown')
例如:
class EmpList(ListView):
queryset = DeptEmp.objects.all().select_related('emp_no').select_related('dept_no')
employee_list.html
% for deptemp in object_list %
deptemp.emp_no.first_name
deptemp.emp_no.last_name
deptemp.dept_no.dept_name
% endfor %
【讨论】:
啊。太感谢了。太棒了。我得到的是表名而不是 select_related() 中的键。以上是关于如何使用 Django 在查询中加入 3 个表的主要内容,如果未能解决你的问题,请参考以下文章