1. 程式人生 > >Django Field lookups (欄位查詢)

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