登录 | 注册
   首 页   分享小组   同 城   即时贴  
     高级搜索
更有效的判断一条记录是否存在 . . .  
duma   楼主 

大家在做判断一个记录是否为真时,是不是都这么做:
方法1:
try:
----product = Product.objects.get(id=1)
except:
----#do something...


方法2:
product = Product.objects.filter(id=1)
if product:
----#do something...

方法1有些罗嗦,不多说了.下面说说方法2.
用方法2时,我认为有性能问题。OK,改进一下:
product = Product.objects.filter(id=1)[0]
if product:
----#do something...

不错,这样就用到 SQL 的 LIMIT 1了。可好是好,但是返回空集([])时,是会报错的啊!不要紧,再改进:
product = Product.objects.filter(id=1)[:1]
if product:
----#do something...

这样的话,即用到了SQL的LIMIT 1,又不怕返回空集喽~
可有人举手了: django 是 lazy ,方法2不会有性能问题。
我做了个实验:
进入 manage.py shell 中,我通过打印SQL语句发现:
1. product = Product.objects.filter(id=1)
2. if product: print 'ture'
第1句不会生成SQL,但第2句就会生成SQL了。

小小经验,不希望误倒他人,如有错误,请回贴指点~~


jt.rocky   发表于 2008-08-27 17:59:40 1楼 

进入 manage.py shell 中,我通过打印SQL语句发现...
---------没看懂,具体怎么做?我没打印过。
---------如果只有一个id,可否考虑用get_or_404?



duma   发表于 2008-09-02 11:37:40 2楼 

@jt.rocky 你好:
1.实现方法要用到 django 的“中间件”的 process_response(self, request, response)方法。
自制中间件的细节我就不做解释了。

用法:
from django.db import connection

def process_response(self, request, response):
----for x in connection.queries:
--------print x
----return response
ok 就这么简单,如果你是用 django 自带的服务器,就可以在SHELL里看到结果了。

2.这个要看自己的具体应用了,我最终的意思是:如果只是用 filter 判断记录是否为真时,一定要加上读取的记录数。



jt.rocky   发表于 2008-09-02 12:20:47 3楼 

赞!
有空我也做一个!





Django


返回小组讨论




©aggua.com 京ICP备07040486号 关于阿瓜 | BLOG | 排行榜 | 常见问题 | 友情链接
インプラント インプラント京都 インプラント費用 レーシック 審美歯科 わきが 脱毛 漢方 薬剤師求人 インプラント