如何在Django中“过滤”“存在”?

时间:2010-10-15 17:15:03

标签: django django-queryset

我想根据某个子查询是否返回任何结果来过滤查询集。在SQL中,这可能如下所示:

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

换句话说,检索用其中一个指定标签标记的所有事件。

我如何在模型EventTag上使用Django的QuerySet API来表达这一点?

2 个答案:

答案 0 :(得分:12)

您可以这样做:

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

假设从ForeignKeyTagEvent

解释:您正在根据特定条件过滤Event个对象。使用双下划线语法,您将访问text实例的Tag属性,然后附加IN条件。您不必担心加入外键; Django在幕后为您做到了这一点。如果您想要查看生成的查询,可以打印它:

print q.query

答案 1 :(得分:5)

当事件有多个标签时,Manoj的解决方案可能会导致问题。

SQL内部联接返回所有行,因此事件可能有重复的结果,解决方案是添加不同的方法。

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