django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 - 哈欠涟涟的日志 - 网易博客
在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-01and 2008-12-31 23:59:59.999999AND "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-01and 2008-12-31 23:59:59.999999)LIMIT 21比较这两个sql语句,发现功能上两者是一样的,但第二个查询语句多了一个INNER JOIN 语句,从性能上讲,应该是第一个查询高效一点。这两个查询语句,生成的sql语句有差别,会不会是与django debug toolbar的实现有关,对于此点,我不清楚。