2011-06-09 33 views
0

首先,给定一个模型Foo和它的M2M指向Bar,请问下面的查询工作(当没有什么是NULL本身(加入和第一部分中省略):Django的 - 查询集和一般的SQL问题

>> print Foo.objects.get(bar__isnull=True).query 
...WHERE "barapp_bar"."id" IS NULL 

空的东西抛出我送行与相关M2M关于过滤

其次,是有办法,有很多行打交道时,使这个类似的查询速度更快:

Foo.objects.get(bar__in=[bar1, bar2, bar3, bar4]) 

回答

0

ommitted连接是重要的。如果查看完整查询,您将看到Django从foo表执行了两个Left Outer Joins到加入表foo_barbar表。

考虑两个foos和两个bars。假设foo_1bar_1bar_2foo_2有关,与bars没有任何关系。

以下带有两个左外连接的查询至少包含foo,NULL将出现在foo_2的栏列中,该列与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.idNULL,因为我们只希望它不涉及任何barsfoos

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  | 
+--------+ 
+0

谢谢!关于第二个问题,关于实现相同结果的优化查询呢?它甚至有可能吗? – orokusaki 2011-06-10 21:23:43

+0

我对你的第二个问题没有任何建议。如果你使用Django的'syncdb'命令创建表,那么你的表应该有合适的索引,这样查询就很有效率。 – Alasdair 2011-06-14 21:01:29