我想根据某个子查询是否返回任何结果来过滤查询集。在SQL中,这可能如下所示:
SELECT * FROM events e WHERE EXISTS
(SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def"))
换句话说,检索用其中一个指定标签标记的所有事件。
我如何在模型Event
和Tag
上使用Django的QuerySet API来表达这一点?
答案 0 :(得分:12)
您可以这样做:
q = Event.objects.filter(tag__text__in = ['abc', 'def'])
假设从ForeignKey
到Tag
有Event
。
解释:您正在根据特定条件过滤Event
个对象。使用双下划线语法,您将访问text
实例的Tag
属性,然后附加IN
条件。您不必担心加入外键; Django在幕后为您做到了这一点。如果您想要查看生成的查询,可以打印它:
print q.query
答案 1 :(得分:5)
当事件有多个标签时,Manoj的解决方案可能会导致问题。
SQL内部联接返回所有行,因此事件可能有重复的结果,解决方案是添加不同的方法。
q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()