Django ORM基本介绍

检索对象

要从数据库中检索对象,即数据记录,要通过模型类的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 datetime
start_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';

你可能感兴趣的