django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客

摘要:
为了了解这两种表示是否相同,最好的方法是生成两种表示的SQL语句,然后比较它们。调试工具栏很方便。看见http://pypi.python.org/pypi/django-debug-toolbar/0.8.3,您可以发现在安装了这个之后,您可以使用debugsqlshell来查看sql语句。我把这个模型放在myapp中,然后生成相应的sql语句。这两条查询语句生成的SQL语句不同。它与djangodebug工具栏的实现有关吗?我不知道。

django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 - 哈欠涟涟的日志 - 网易博客

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的实现有关,对于此点,我不清楚。

免责声明:文章转载自《django orm中filter(条件1).filter(条件2)与filter(条件1,条件2)的区别 哈欠涟涟的日志 网易博客》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos使用yum安装mysqlExtjs校验配置项下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis教程:入门>>精通>>实战

以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 m...

使用Hibernate

1、Hibernate框架设计原理 1)设计原理 Hibernate采用ORM思想对JDBC进行封装,Hibernate框架是ORM思想的一种实现,解决对象和数据库数据映射问题 Hibernate提供一系列API,允许我们直接访问实体对象,然后根据ORM映射关系,转换成SQL去执行,从而达到访问数据库的目的。 2)ORM思想 ORM(ObjectRela...

django 应用模态框

在django 模板页面,如果想要进行点击弹出模态框,单独对模态框进行编辑,需要做一下操作1. 做一个<a> 标签链接 <a modal-title="模态框标题头" data-target="#add" data-toggle="modal" data- data-width="700"href="http://t.zoukankan...

Django模型Model之数据控制详解

模型是MVC架构中访问数据的模块,Django的模型对各种数据库提供了很好的支持。这里以MySQL为例介绍Django的模型。 使用模型 启用数据库支持 在项目的 settings.py 文件中找到 DATABASES 配置项, 根据数据库配置信息: DATABASES = { 'default': { 'ENGINE': 'dj...

Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

在前后端分离项目中前面我们也提到了各种认证需要自己来做,那么我们用rest_framework的时候 rest_framework也为我们提供相应的接口,rest_framework中的APIView实现了和Django原生View  as_view()一样的功能 并在此基础上实现了原生request的封装、认证、权限、视图等等功能 我们来看APIView...

django 后台格式化数据库查询出的日期

在项目中,我遇到这样的情况,使用ajax获取查询出来的数据,而这些数据中某个字段是日期datetime格式,在模板中显示的样式很怪异。由于前端使用了js控件,也不能使用django的模板过滤器。 所以这种情况下,我想将日期从数据库中查询出来就使用固定好的格式。 django 中直接执行sql语句查询 from django.db import connec...