2017-05-04 68 views
0

models.py如何加入查询3个表和Django

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'。选择是:(无)

+0

什么是员工?以及模板中的部门是什么? – karthikr

+0

我想你正在寻找一个ManyToManyField(https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField)。这会在db上创建一个类似于DeptEmp模型的中间表。 –

+0

@karthikr,谢谢你指出。我纠正了它。请看我编辑的模板文件。 –

回答

0

“select_related”

返回一个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')

为了您exmaples打电话:

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 %} 
+0

啊。非常感谢。太棒了。我得到了表名,而不是select_related()中的键。 –