问题描述
||
首先,给定模型
Foo
,它的m2m指向Bar
,以下查询如何工作(nothing2ѭ本身什么都不是时(省略联接和第一部分)):
>> print Foo.objects.get(bar__isnull=True).query
...WHERE \"barapp_bar\".\"id\" IS NULL
空的东西使我不愿接受有关m2m的过滤。
其次,在处理大量行时,有没有一种方法可以使此类似查询更快:
Foo.objects.get(bar__in=[bar1,bar2,bar3,bar4])
解决方法
省略的连接很重要。如果查看完整的查询,您会发现Django从
foo
表到连接表foo_bar
和bar
表做了两个Left Outer Joins。
考虑两个two8ѭ和两个bars
。令ѭ10与ѭ11和ѭ12相关,ѭ13与任何ѭ9不相关。
下面带有两个左外部联接且每个foo
的查询至少包含一次,并且ѭ13bar的栏中将显示NULL,而这与任何bars
都不相关。
SELECT foo.id as foo_id,bar.id as bar_id
FROM foo LEFT OUTER JOIN foo_bar
ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
ON foo_bar.bar_id = bar.id;
+--------+--------+
| foo_id | bar_id |
+--------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | NULL |
+--------+--------+
Foo.objects.get(bar__isnull=True)
的查询与此类似,但是它没有从条形表中选择任何内容,它对bar.id
的筛选为NULL
,因为我们只希望与任何bars
不相关的foos
。
SELECT foo.id as foo_id
FROM foo LEFT OUTER JOIN foo_bar
ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
ON foo_bar.bar_id = bar.id
where bar_id is NULL;
+--------+
| foo_id |
+--------+
| 2 |
+--------+