检索对象
要从数据库中检索对象,即数据记录,要通过模型类的Manager(默认名称是objects,能够对其重写)构建一个QuerySet。
一个QuerySet代表来自数据库中对象的一个汇合,对应SQL的SELECT语句,能够通过filters来放大范畴,对应SQL层面的WHERE或LIMIT子句。
过滤器有filter(kwargs)和exclude(kwargs),返回的都是QuerySet对象,且每一个QuerySet对象是惟一的。
其余常见API
(1)order_by(*fields)
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
(2)distinct(*fields)
QuerySet是惰性的,详情见QuerySet何时被执行
限度QuerySet条目数
利用python的数组切片语法,等价于SQL的LIMIT和OFFSET子句。例如Entry.objects.all()[5:10]
字段查问
字段查问即如何制订SQL的WHERE子句,以关键字参数传递给filter/exclude/get。
格局为:field__lookuptype=value
例如
Entry.objects.filter(pub_date__lte='2006-01-01')
等价于
SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
常见lookuptype
参考QuerySet API 参考
(1)exact(默认)
Entry.objects.filter(pub_date=None)Entry.objects.filter(pub_date__isnull=True)
(2)iexact--不辨别大小写
(3)contains--大小写敏感的蕴含,相似于LIKE
(4)icontains--不辨别大小写
(5)startswith/istartswith--以xx开始
(6)endswith/iendswith--以xx完结
(7)in
Entry.objects.filter(id__in=[1, 3, 4])# SELECT ... WHERE id IN (1, 3, 4);Entry.objects.filter(headline__in='abc')# SELECT ... WHERE headline IN ('a', 'b', 'c');# 也能够应用一个查问集来动静计算值列表,而不是提供一个字面值列表inner_qs = Blog.objects.filter(name__contains='Cheddar')entries = Entry.objects.filter(blog__in=inner_qs)# SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
(8)gt -- 大于; gte -- 大于的等于;
(9)lt ; lte;
(10)range -- 范畴(含)
import datetimestart_date = datetime.date(2005, 1, 1)end_date = datetime.date(2005, 3, 31)Entry.objects.filter(pub_date__range=(start_date, end_date))# SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';