0. 字段查找是什么
所谓字段查找就是Django为了实现SQL语句中诸如 > < LIKE IN 这类关键词,而提供用户的一种接口方式。可用于filter, exclude,get等函数中。
书写方式: 在字段名称后加上2个下划线 再加上查找类型关键字 就能形成丰富多样的查找方式。
所有内容均摘自Django官方网站的教程。
参考原文地址: http://docs.djangoproject.com/en/1.3/ref/models/querysets/#field-lookups
1. exact 精确匹配查找
样例:
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
等价的SQL语句:
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
exact是大小写相关的,如果需要忽略大小写,那么使用iexact即可。前缀 i 即 ignore。
2. contains 包含查找
样例:
Entry.objects.get(headline__contains='Lennon')
等价的SQL语句:
SELECT ... WHERE headline LIKE '%Lennon%';
contains也是大小写相关,如果需要忽略大小写,那么如同exact的方式,在contains前加 i 前缀,即icontains
3. in 在列表中查找
样例:
Entry.objects.filter(id__in=[1, 3, 4])
等价的SQL语句:
SELECT ... WHERE id IN (1, 3, 4);
我们也可以用一个查询集(queryset)以动态求值的方式得到一个列表,来代替以上字面方式的列表。
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%')
Django处理in查找是通过SQL本身的子查询语法来完成的。但从性能上考虑,某些数据库尤其是MySQL,对子查询支持的不是那么好。将嵌有一个子查询的查询分成2个查询来做,很多时候,效率要好一些。如下:
values = Blog.objects.filter(name__contains='Cheddar').values_list('pk', flat=True)
entries = Entry.objects.filter(blog__in=list(values))
4. gt gte lt lte 比较大小等于
● gt = great than 大于
样例:
Entry.objects.filter(id__gt=4)
等价的SQL语句:
SELECT ... WHERE id > 4;
● gte = great than or equal to 大等于
● lt = less than 小于
● lte = less than or equal to 小等于
5. startswith 以...开始查找
样例:
Entry.objects.filter(headline__startswith='Will')
等价的SQL语句:
SELECT ... WHERE headline LIKE 'Will%';
如果需要忽略大小写,那么使用istartswith.
6. endswith 以...结尾查找
样例:
Entry.objects.filter(headline__endswith='cats')
等价的SQL语句:
SELECT ... WHERE headline LIKE '%cats';
如果需要忽略大小写,那么使用iendswith.
7. range 范围查找
样例:
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
等价的SQL语句:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
在SQL中任何可以使用BETWEEN的地方,等价地使用range,类型范围包括:日期、数字、字符
8. year 按年查找 month 按月查找 day 按日查找
样例:
Entry.objects.filter(pub_date__year=2005)
等价的SQL语句:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31 23:59:59.999999';
注: 对不同的数据库,Django等价实现的SQL语句也会有所不同
对于month和day关键字,Django也有等价的SQL语句转换。
9. week_day 按星期几查找
如果要查询星期二的数据,可以如下
样例:
Entry.objects.filter(pub_date__week_day=2)
10. isnull 是否为空查找
样例:
Entry.objects.filter(pub_date__isnull=True)
等价的SQL语句:
SELECT ... WHERE pub_date IS NULL;
11. search 和 regex
暂空。