Django Field lookups (字段查找)
字段查找是指定SQL WHERE子句的核心内容的方式。
它们被指定为QuerySet方法filter()、exclude()和get()的关键字参数。
1、exact:精确查找。如果为比较提供的值为None,则会将其解释为SQL NULL
在MySQL中,数据库表的“排序”设置决定了精确的比较是否区分大小写。这是一个数据库设置,而不是Django设置。
可以将MySQL表配置为使用区分大小写的比较。
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
2、iexact:不区分大小写的精确查找
Blog.objects.get(name__iexact='beatles blog') Blog.objects.get(name__iexact=None)
SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;
3、contains:包含,模糊查询
Entry.objects.get(headline__contains='Lennon')
SELECT ... WHERE headline LIKE '%Lennon%';
4、icontains:包含,不区分大小写
Entry.objects.get(headline__icontains='Lennon')
SELECT ... WHERE headline ILIKE '%Lennon%';
5、in:范围查询
Entry.objects.filter(id__in=[1, 3, 4]) Entry.objects.filter(headline__in='abc')
SELECT ... WHERE id IN (1, 3, 4); 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%')
如果将由values()或values_list()生成的QuerySet作为值传递给__in查找,则需要确保只提取结果中的一个字段。
inner_qs = Blog.objects.filter(name__contains='Ch').values('name') entries = Entry.objects.filter(blog__name__in=inner_qs)
6、gt:大于;
gte:大于等于
lt:小于
lte:小于等于
Entry.objects.filter(id__gt=4)
SELECT ... WHERE id > 4;
7、startswith:区分大小写的开始。
istartswith:不区分大小写
Entry.objects.filter(headline__startswith='Lennon')
SELECT ... WHERE headline LIKE 'Lennon%';
Entry.objects.filter(headline__istartswith='Lennon')
SELECT ... WHERE headline ILIKE 'Lennon%';
8、endswith:区分大小写结尾
iendswith:不区分大小写
Entry.objects.filter(headline__endswith='Lennon') SELECT ... WHERE headline LIKE '%Lennon'; Entry.objects.filter(headline__iendswith='Lennon') SELECT ... WHERE headline ILIKE '%Lennon'
9、range:范围
在SQL中,您可以在任何地方使用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';
10、date,year,month,day,weak
Entry.objects.filter(pub_date__year=2005) Entry.objects.filter(pub_date__year__gte=2005) SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31'; SELECT ... WHERE pub_date >= '2005-01-01';
Entry.objects.filter(pub_date__month=12) Entry.objects.filter(pub_date__month__gte=6)
SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
SELECT ... WHERE EXTRACT('month' FROM pub_date) >= '6';
11、weekday:取一个整数值,表示从1(星期日)到7(星期六)的星期几。
Entry.objects.filter(pub_date__week_day=2)
Entry.objects.filter(pub_date__week_day__gte=2)
12、quarter:季度。对于日期和日期时间字段,匹配一个“季度”。允许链接额外的字段查找。取1到4之间的整数值,表示该年度的季度。
Entry.objects.filter(pub_date__quarter=2)
13、time:时间
Entry.objects.filter(pub_date__time=datetime.time(14, 30))
Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))
14、hour:小时。对于日期时间和时间字段,一个精确的小时匹配。允许链接额外的字段查找。取0到23之间的整数。
minute:分钟。0-59
second:秒。0-59
Event.objects.filter(timestamp__hour=23) Event.objects.filter(time__hour=5) Event.objects.filter(timestamp__hour__gte=12) SELECT ... WHERE EXTRACT('hour' FROM timestamp) = '23'; SELECT ... WHERE EXTRACT('hour' FROM time) = '5'; SELECT ... WHERE EXTRACT('hour' FROM timestamp) >= '12';
15、isnull:是否为空,对应SQL的IS NULL 和IS NOT NULL
Entry.objects.filter(pub_date__isnull=True)
SELECT ... WHERE pub_date IS NULL;
16、regex:正则匹配
iregex:不区分大小写的正则表达式
Entry.objects.get(title__iregex=r'^(an?|the) +') SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite