Внутреннее соединение на Django с предложением where? - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь отфильтровать ModelForm для отображения только выпадающих значений, связанных с указанным c пользователем.

У меня есть три таблицы, связанные вместе:

User , Project, ProjectUser.

У одного пользователя может быть много проектов, а у одного проекта может быть много пользователей, а таблица ProjectUser - это просто объединенная таблица между User и Project, например,

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>

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Когда Django ORM применяет фильтр к полю, указанному как внешний ключ, Django ORM понимает, что это связанная таблица, и присоединяется к ней.

Project.objects.filter(projectuser__user=user)

Вы можете объединить несколько таблиц или даже применить фильтр к обратному внешнему ключу! Вы можете использовать related_name поля ForeignKey соответствующим образом.

0 голосов
/ 13 января 2020

Вы оригинал SQL

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

Итак, когда я вижу ваш SQL, вы хотите получить список name из projectuser для уточнения c 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...