Джанго оставил соединение с фильтром на модели «многие ко многим» - PullRequest
0 голосов
/ 16 мая 2019

У меня есть 3 модели (модель по умолчанию для пользователя, Project, пользовательская модель m2m ClickedUsers), и я хочу выполнить левое соединение с фильтром в ORM для моделей ClickedUsers и Project.Я пробовал решения для переполнения стека, но когда я печатал эти запросы, я видел, что они выполняли внутреннее соединение.

Вот мои модели:

class Project(models.Model):
        …
    clicked_users = models.ManyToManyField(User,through='ClickedUsers',blank=True)


class ClickedUsers(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    project = models.ForeignKey(Project,on_delete=models.CASCADE)
    status = models.IntegerField(default=0)

И запрос, который я хочу выполнить:

select * from project LEFT JOIN clickedusers ON project.id = clickedusers.project_id WHERE clickedusers.user_id = 1;

Как я могу выполнить этот запрос с помощью django orm?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Посмотрите на обратные отношения и related_name.

Project.objects.filter(clicked_users__id=1)

Или вы используете сквозную модель:

Project.objects.filter(clickedusers_set__user_id=1)

Edit: Я пропустил * из select * from. Если вам нужны все поля, вам нужно использовать:

ClickedUser.objects.filter(
    user_id=1,
).select_related('project')
1 голос
/ 16 мая 2019

A LEFT JOIN не даст вам результатов, отличных от INNER JOIN в этом запросе

SELECT *
FROM table_1
JOIN table_2 on table_2.table_1_id = table_1.id
WHERE table_2.field = some_value;

Поскольку у вас есть поле из table_2 в предложении where, вы можете получить результаты только из table_1когда есть запись в таблице_2.LEFT JOIN говорит, что нужно получать записи из таблицы_1, даже если в таблице_2 нет записей, удовлетворяющих критериям объединения.

Причина, по которой вы не получаете запрос от ORM, который вы хотите, состоит в том, что ORM распознает егоможно использовать INNER JOIN вместо LEFT JOIN без изменения результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...