Как «отфильтровать» по «существует» в Django? - PullRequest
5 голосов
/ 15 октября 2010

Я хотел бы отфильтровать набор запросов по тому, возвращает ли определенный подзапрос какие-либо результаты.В SQL это может выглядеть так:

SELECT * FROM events e WHERE EXISTS
    (SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def"))

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

Как я могу выразить это с помощью API QuerySet Djangoмодели Event и Tag?

Ответы [ 2 ]

12 голосов
/ 15 октября 2010

Вы можете сделать что-то вроде этого:

q = Event.objects.filter(tag__text__in = ['abc', 'def'])

Предполагая, что есть ForeignKey от Tag до Event.

Объяснение : Вы фильтруете Event объекты на основе определенных критериев.Используя синтаксис двойного подчеркивания, вы получаете доступ к атрибуту text экземпляров Tag и затем присоединяете условие IN.Вам не нужно беспокоиться о соединении по внешнему ключу;Джанго делает это для вас за кулисами.Если вам интересно увидеть сгенерированный запрос, вы можете напечатать его:

print q.query
5 голосов
/ 11 апреля 2011

Решение Маноя может вызвать проблему, когда для события существует несколько тегов.

Внутреннее соединение SQL возвращает все строки, поэтому у событий могут быть дублированные результаты, решение состоит в том, чтобы добавить отдельный метод.

q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()

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