Не уверен, как выполнить сложный запрос с Django - PullRequest
0 голосов
/ 04 апреля 2020

Я застрял в запросе, который пытаюсь выполнить. Я приложил изображение модели данных ниже. По сути, я получил 6 таблиц с различными отношениями. Вот краткий итог:

  1. Один User может иметь много Projects, и каждый Expense привязан к конкретному c проекту
  2. Каждый проект может иметь много пользователи, и каждый пользователь может иметь много проектов, соединенных через объединенную таблицу - UserProject
  3. Чтобы указать уровень доступа, который пользователь имеет к указанному c проекту, поле с именем role добавлен в таблицу UserProject - пользователь может быть либо участником, либо администратором проекта.

. Запрос, который я должен составить sh, состоит в том, чтобы получить все расходы, которые созданный вошедшим в систему пользователем (request.user) и всеми расходами всех проектов, в которых пользователь имеет роль admin из таблицы UserProject.

См. Изображение модели данных ниже:

Data model

Есть идеи, как мне поступить с этим запросом?

1 Ответ

0 голосов
/ 04 апреля 2020

Думаю, я понял это с помощью 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)))
...