`
nswish
  • 浏览: 104672 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Django 1.3 字段查找参考(field lookup reference)

阅读更多

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

暂空。


0
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics