首先,给定一个模型Foo
并且它的m2m指向Bar
,以下查询如何工作(当真正没有NULL
本身时(加入和第一部分ommited):
>> print Foo.objects.get(bar__isnull=True).query
...WHERE "barapp_bar"."id" IS NULL
关于通过相关的m2m进行过滤,null的东西会让我失望。
其次,有没有办法在处理大量行时更快地使这个类似的查询:
Foo.objects.get(bar__in=[bar1, bar2, bar3, bar4])
答案 0 :(得分:0)
省略的连接非常重要。如果查看完整查询,您将看到Django从foo
表到加入表foo_bar
和bar
表执行了两次Left Outer Joins。
考虑两个foos
和两个bars
。让foo_1
与bar_1
和bar_2
相关联,foo_2
与任何bars
无关。
下面的查询包含两个左外连接,每个foo
至少包含一次,而foo_2
的栏列中将显示NULL,这与任何bars
无关。< / p>
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
,因为我们只需{ {1}}与任何foos
无关。
bars