注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

哈欠涟涟的博客

学习python、pyqt与django

 
 
 

日志

 
 

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

2010-05-28 11:12:25|  分类: django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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的实现有关,对于此点,我不清楚。
  评论这张
 
阅读(3623)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017