使用 where 子句在 Django 上进行内部连接?

Inner join on Django with where clause?

我正在尝试过滤掉 ModelForm 以仅显示与特定用户关联的下拉值。

我把三个 tabled 绑在一起了:

User, Project, ProjectUser.

一个用户可以有多个项目,一个项目可以有多个用户,table ProjectUser只是User和[=之间的table 13=],例如

id | project_id | user_id 
1      5            1
2      6            2
3      6            1

如何在 Django ORM 中编写以下内部联接查询?

SELECT name
FROM projectuser
INNER JOIN project 
ON projectuser.project_id = project.id
WHERE user_id = <request.user here>

当 Django ORM 将 Filter 应用于指定为外键的字段时,Django ORM 理解它是一个相关的 table 并加入它。

Project.objects.filter(projectuser__user=user)

您可以连接多个 table,甚至可以对外键的反向应用过滤器! ForeignKey字段的related_name可以适当使用

你原创SQL

SELECT name
FROM projectuser
INNER JOIN project 
ON projectuser.project_id = project.id
WHERE user_id = <request.user here>

所以我看到你的 SQL,你想从 projectuser 中获取 name 的特定 user 列表。如果是这样,这里是答案

ProjectUser.objects.filter(user_id = user).values_list('name', flat = True)

我看到你接受 Project.objects.filter(projectuser__user=user)

的回答

对于此答案,您的 SQL 应如下所示

SELECT name
FROM project
INNER JOIN projectuser 
ON projectuser.project_id = project.id
WHERE projectuser.user_id = <request.user here>