查詢集Django 模型通過默認(rèn)的 Manager 類objects來訪問數(shù)據(jù)庫。例如,要打印所有 Job 的列表,則應(yīng)該使用objects管理器的all方法:清
Django 模型通過默認(rèn)的 Manager 類 objects
來訪問數(shù)據(jù)庫。例如,要打印所有 Job 的列表,則應(yīng)該使用 objects
管理器的 all
方法:
1
2
3
|
>>> from jobs.models import Job >>> for job in Job.objects.all(): ... print job |
Manager 類還有兩個(gè)過濾方法:一個(gè)是 filter
,另外一個(gè)是 exclude
。過濾方法可以接受滿足某個(gè)條件的所有方法,但是排除不滿足這個(gè)條件的其他方法。下面的查詢應(yīng)該可以給出相同的結(jié)果(“gte” 表示 “大于或等于”,而 “lt” 表示 “小于”)。
1
2
3
4
|
>>> 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 對(duì)象,這些對(duì)象可以鏈接在一起,甚至可以執(zhí)行連接操作。下面的 q4
查詢會(huì)查找從 2006 年 1 月 1 日開始在俄亥俄州的 Cleveland 張貼的職位:
1
2
3
4
5
|
>>> 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 是惰性的,這一點(diǎn)非常不錯(cuò)。這意味著只在對(duì)數(shù)據(jù)庫進(jìn)行求值之后才會(huì)對(duì)它們執(zhí)行查詢,這會(huì)比立即執(zhí)行查詢的速度更快。
這種惰性利用了 Python 的分片(slicing)功能。下面的代碼并沒有先請求所有的記錄,然后對(duì)所需要的記錄進(jìn)行分片,而是在實(shí)際的查詢中使用了 5 作為 OFFSET、10 作為 LIMIT,這可以極大地提高性能。
1
2
3
|
>>> from jobs.models import Job >>> for job in Job.objects.all()[5:15] ... print job |
注意:使用 count
方法可以確定一個(gè) QuerySet 中有多少記錄。Python 的 len
方法會(huì)進(jìn)行全面的計(jì)算,然后統(tǒng)計(jì)那些以記錄形式返回的行數(shù),而 count
方法執(zhí)行的則是真正的 SQL COUNT 操作,其速度更快。我們這樣做,數(shù)據(jù)庫管理員會(huì)感激我們的。
1
2
3
|
>>> from jobs.models import Job >>> print "Count = ", Job.objects.count() # GOOD! >>> print "Count = ", len(Job.objects.all()) # BAD! |
Python交流群
635448130點(diǎn)擊加入群聊UI設(shè)計(jì)交流群
579150876點(diǎn)擊加入群聊Unity交流群
495609038點(diǎn)擊加入群聊HTML5交流群
645591648點(diǎn)擊加入群聊