2010-10-15 1 views
5

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

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?

ответ

12

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

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

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

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

print q.query 
+0

Спасибо Манодж, я, кажется, часто забывают попробовать «очевидно» в Django и начать думать о чем-то, что это довольно сложно. –

5

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^