打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Django 查询集

查询集

Django 模型通过默认的 Manager 类 objects 来访问数据库。例如,要打印所有 Job 的列表,则应该使用 objects 管理器的 all 方法:

清单 11. 打印所有的职位
>>> from jobs.models import Job>>> for job in Job.objects.all():...     print job

Manager 类还有两个过滤方法:一个是 filter,另外一个是 exclude。过滤方法可以接受满足某个条件的所有方法,但是排除不满足这个条件的其他方法。下面的查询应该可以给出相同的结果(“gte” 表示 “大于或等于”,而 “lt” 表示 “小于”)。

清单 12. 排除和过滤职位
>>> from jobs.models import Job>>> from datetime import datetime>>> q1 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))>>> q2 = Job.objects.exclude(pub_date__lt=datetime(2006, 1, 1))

filterexclude 方法返回一些 QuerySet 对象,这些对象可以链接在一起,甚至可以执行连接操作。下面的 q4 查询会查找从 2006 年 1 月 1 日开始在俄亥俄州的 Cleveland 张贴的职位:

清单 13. 对职位进行更多的排除和过滤
>>> from jobs.models import Job>>> from datetime import datetime>>> q3 = Job.objects.filter(pub_date__gte=datetime(2006, 1, 1))>>> q4 = q3.filter(location__city__exact="Cleveland",...                location__state__exact="Ohio")

QuerySets 是惰性的,这一点非常不错。这意味着只在对数据库进行求值之后才会对它们执行查询,这会比立即执行查询的速度更快。

这种惰性利用了 Python 的分片(slicing)功能。下面的代码并没有先请求所有的记录,然后对所需要的记录进行分片,而是在实际的查询中使用了 5 作为 OFFSET、10 作为 LIMIT,这可以极大地提高性能。

清单 14. Python 分片
>>> from jobs.models import Job>>> for job in Job.objects.all()[5:15]...     print job

注意:使用 count 方法可以确定一个 QuerySet 中有多少记录。Python 的 len 方法会进行全面的计算,然后统计那些以记录形式返回的行数,而 count 方法执行的则是真正的 SQL COUNT 操作,其速度更快。我们这样做,数据库管理员会感激我们的。

清单 15. 统计记录数
>>> from jobs.models import Job>>> print "Count = ", Job.objects.count()       # GOOD!>>> print "Count = ", len(Job.objects.all())    # BAD!

有关的更多信息,请参阅 参考资料 部分给出的 Django “Database API reference” 的链接。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python测试开发django-75.ORM根据日期查询(__range)
编写第一个Django应用:第一部分
Python学习笔记八(网站开发)
Django 数据导入
python 3.7 配置mysql数据库
python使用pymysql实现操作mysql
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服