Django - 查询集和一般SQL问题

时间:2011-06-09 22:08:28

标签: python django query-optimization django-queryset

首先,给定一个模型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])

1 个答案:

答案 0 :(得分:0)

省略的连接非常重要。如果查看完整查询,您将看到Django从foo表到加入表foo_barbar表执行了两次Left Outer Joins

考虑两个foos和两个bars。让foo_1bar_1bar_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