如何使用 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 个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中加入3个表

如何在需要按一个键列分组的 3 个表中加入和求和值

在 django 中加入 2 个表超过 2 列

如何在Django中加入非主键和外键列的查询

如何在 SQL Server 中加入两个查询的结果?

如何在 SQL 中加入六个表,同时只包含某些行?