django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别

2010-05-28 11:12:25|分类:
django
|标签:

|字号订阅

在http://docs.djangoproject.com/en/1.2/topics/db/queries/#lookups-that-span-relationships中有两个查询,感觉弄不明白

Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008)

Blog.objects.filter(entry__headline__contains='Lennon').filter( entry__pub_date__year=2008)

从英文文档上看看两者应该是一样的,但网上也有文章说两者之间有时也有区别。
为了能弄明白这两种表示到底是不是有一样的,最好的方法是能把两种表示的sql语句生成出来,然后再来比较。
此时Debug Toolbar就派上用场了。查看http://pypi.python.org/pypi/django-debug-toolbar/0.8.3,可以发现装上这个之后,可以使用debugsqlshell来查看sql语句。
我把这一个models.py放在myapp中,然后生成相应的sql语句。
第一个查询语句生成的sql语句为:

SELECT "myapp_blog"."id",
"myapp_blog"."name",
"myapp_blog"."tagline"
FROM "myapp_blog"
INNER JOIN "myapp_entry" ON ("myapp_blog"."id" = "myapp_entry"."blog_id")
WHERE ("myapp_entry"."pub_date" BETWEEN 2008-01-01
and 2008-12-31 23:59:59.999999
AND "myapp_entry"."headline" LIKE %Lennon% ESCAPE '\')LIMIT 21
第二个查询语句生在的sql语句为:
SELECT "myapp_blog"."id",
"myapp_blog"."name",
"myapp_blog"."tagline"
FROM "myapp_blog"
INNER JOIN "myapp_entry" ON ("myapp_blog"."id" = "myapp_entry"."blog_id")
INNER JOIN "myapp_entry" T3 ON ("myapp_blog"."id" = T3."blog_id")
WHERE ("myapp_entry"."headline" LIKE %Lennon% ESCAPE '\'
AND T3."pub_date" BETWEEN 2008-01-01
and 2008-12-31 23:59:59.999999)LIMIT 21
比较这两个sql语句,发现功能上两者是一样的,但第二个查询语句多了一个INNER JOIN 语句,从性能上讲,应该是第一个查询高效一点。
这两个查询语句,生成的sql语句有差别,会不会是与django debug toolbar的实现有关,对于此点,我不清楚。

发表回复