Django-查询集和常规SQL问题

问题描述

|| 首先,给定模型
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      |
+--------+