【问题标题】:Inner Join in DjangoDjango中的内部连接
【发布时间】:2017-11-16 20:41:45
【问题描述】:

我有两张桌子

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    |                |
+-----------------+--------------+------+-----+---------+----------------+

和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')

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

【问题讨论】:

  • 您需要展示您的模型。通常,Django 通过ForeignKey 字段为您处理内部连接 ​​- 如果您正确设置模型,这将是微不足道的。

标签: python sql django orm


【解决方案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 可以正常工作,但您必须手动导入模型。

【讨论】:

  • 如果其中一部分是只过滤有图像的员工,请使用 Employee.objects.filter(employee_img__isnull=False)。最后,Django 的文档非常好。如果您还没有,我会尽可能多地阅读。
猜你喜欢
  • 2018-01-07
  • 2017-05-19
  • 1970-01-01
  • 2013-03-22
  • 2018-06-16
  • 2018-10-08
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多