惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
腾讯CDC
爱范儿
爱范儿
Google DeepMind News
Google DeepMind News
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
量子位
F
Fortinet All Blogs
G
Google Developers Blog
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
J
Java Code Geeks
S
SegmentFault 最新的问题
D
Docker
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
M
MIT News - Artificial intelligence
博客园 - 【当耐特】

博客园 - yaksea

APScheduler: standalone vs daemonic 一句话解释jquery中offset、pageX, pageY、position、scrollTop, scrollLeft的区别 mongodb正则查询使用须知 PhoneGap源代码下载地址 python mysql 库的安装 windows环境下PYTHONPATH的设置 Eclipse+pydev2.2+python2.7 中文乱码问题 雷军:互联网创业的葵花宝典 什么是node.js 对python元类概念的理解 设置Django,在Eclipse+PyDev环境中开发Django应用 Python的模块、包等概念的理解 Python下划线与命名规范 Django IDE 开发环境的搭建 在Eclipse下如何安装插件 使用Django如无到有11步快速构建Web应用 如何使用blog客户端 Apache如何添加虚拟目录 Zend Studio下的PHP代码调试
Django如何进行数据访问查询
yaksea · 2011-08-29 · via 博客园 - yaksea

查询集合

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))

filter exclude 方法返回一些 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")

这种惰性利用了 Python 的分片(slicing)功能。下面的代码并没有先请求所有的记录,然后对所需要的记录进行分片,而是在实际的查询中使用了 5 作为 OFFSET10 作为 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!