内部加入Django

时间:2017-11-16 20:41:46

标签: python sql django orm

我有两张桌子

front_employee(Django中的员工模型)

+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| order           | int(11)      | NO   |     | NULL    |                |
| name            | varchar(100) | YES  |     | NULL    |                |
| position        | varchar(100) | YES  |     | NULL    |                |
| description     | longtext     | YES  |     | NULL    |                |
| employee_img_id | int(11)      | NO   | MUL | NULL    |                |
| language_id     | int(11)      | NO   | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

and front_employeepicture(Django中的EmployeePicture)

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| order | int(11)      | NO   |     | NULL    |                |
| img   | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

我想执行此查询:

SELECT a.id, a.name, b.img
FROM front_employee a
INNER JOIN front_employeepicture b
ON a.employee_img_id = b.id

现在我有

context['employee'] = Employee.objects.all().order_by('order')

我试过像

这样的东西
context['employee'] = Employee.objects.select_related('EmployeePicture')

没有结果。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Django的ORM非常强大。你实际上不必做那样的连接。当您访问该字段时,ORM会动态执行连接,返回您想要的结果。

first_employee = Employee.objects.all().first()
employee_picture = first_employee.employee_img

然后employee_picture应该有第一个员工的照片。它需要在内部做一个内部联接来解决这个问题,但是Django为你隐藏了所有这些。 (我可能已经弄错了你的变量名,对不起)。

select_related所做的是预先获取查询集中每个对象的关系。这意味着减少来回数据库的次数,这使您的功能更快。但是,Django允许您仅通过访问属性来遍历关系。

尝试在django shell中搞乱这些东西。我会将django_extensions添加到您的应用中(pip install django-extensions,然后将django_extensions添加到您的INSTALLED_APPS,然后运行python manage.py shell_plus)。如果没有,python manage.py shell工作正常,但您必须手动导入模型。