如何在Django中"过滤""存在"?

Rom*_*kov 5 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"))
Run Code Online (Sandbox Code Playgroud)

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

我会如何表达对这个模型使用Django的查询集API EventTag

Man*_*dan 12

你可以这样做:

q = Event.objects.filter(tag__text__in = ['abc', 'def'])
Run Code Online (Sandbox Code Playgroud)

假设有一个ForeignKey从.TagEvent.

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

print q.query
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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