不确定如何使用 Django 执行复杂的查询
Not sure how to execute complex Query with Django
我被困在我正在尝试执行的查询上。我在下面附上了数据模型的图像。本质上,我得到了 6 个 table 与各种关系。这是一个快速摘要:
- 一个
User
可以有很多Projects
,每个Expense
都绑定到一个特定的项目
- 每个项目可以有多个用户,每个用户可以有多个项目,通过一个joined放在一起table -
UserProject
- 为了指示用户对特定项目的访问级别,将名为 role 的字段添加到
UserProject
table - 用户可以是项目的成员或管理员
我想构建的查询是获取登录用户 (request.user
) 创建的所有费用以及用户所在 all 项目的所有费用具有来自 UserProject
table 的 admin 的角色。
见下图数据模型:
知道我将如何处理该查询吗?
我想我是通过使用 Q 查询解决的
specific_project_users = Expense.objects.filter(
Q(project__projectuser__user=self.user),
Q(project__projectuser__role='admin') | Q(user=self.user)
).values("user__id")
users = User.objects.filter(id__in=specific_project_users)
虽然不确定查询的效率如何。
原始 SQL 查询转换为此
SELECT ...
FROM "accounts_user"
WHERE "accounts_user"."id"
IN (SELECT U0."user_id"
FROM "finances_expense" U0
INNER JOIN "project" U1
ON (U0."project_id" = U1."id")
INNER JOIN "projectuser" U2 ON (U1."id" = U2."project_id")
WHERE (U2."user_id" = 1 AND (U2."role" = admin OR U0."user_id" = 1)))
我被困在我正在尝试执行的查询上。我在下面附上了数据模型的图像。本质上,我得到了 6 个 table 与各种关系。这是一个快速摘要:
- 一个
User
可以有很多Projects
,每个Expense
都绑定到一个特定的项目 - 每个项目可以有多个用户,每个用户可以有多个项目,通过一个joined放在一起table -
UserProject
- 为了指示用户对特定项目的访问级别,将名为 role 的字段添加到
UserProject
table - 用户可以是项目的成员或管理员
我想构建的查询是获取登录用户 (request.user
) 创建的所有费用以及用户所在 all 项目的所有费用具有来自 UserProject
table 的 admin 的角色。
见下图数据模型:
知道我将如何处理该查询吗?
我想我是通过使用 Q 查询解决的
specific_project_users = Expense.objects.filter(
Q(project__projectuser__user=self.user),
Q(project__projectuser__role='admin') | Q(user=self.user)
).values("user__id")
users = User.objects.filter(id__in=specific_project_users)
虽然不确定查询的效率如何。
原始 SQL 查询转换为此
SELECT ...
FROM "accounts_user"
WHERE "accounts_user"."id"
IN (SELECT U0."user_id"
FROM "finances_expense" U0
INNER JOIN "project" U1
ON (U0."project_id" = U1."id")
INNER JOIN "projectuser" U2 ON (U1."id" = U2."project_id")
WHERE (U2."user_id" = 1 AND (U2."role" = admin OR U0."user_id" = 1)))