Django QuerySet - Filter
QuerySet Filter
filter()
方法用於過濾您的搜尋,並允許您僅返回與搜尋詞匹配的行。
正如我們在上一章中學到的,我們可以像這樣按欄位名進行過濾:
在 SQL 中,上述語句會這樣寫:
SELECT * FROM members WHERE firstname = 'Emil';
AND(與)
filter()
方法將引數作為 **kwargs(關鍵字引數),因此您可以透過逗號分隔來過濾多個欄位。
示例
返回 lastname 為 "Refsnes" 且 id 為 2 的記錄
mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
執行示例 »
在 SQL 中,上述語句會這樣寫:
SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;
OR(或)
返回 firstname 為 Emil 或 firstname 為 Tobias 的記錄(表示:返回匹配任一查詢的記錄,不一定兩者都匹配)不像上面的 AND 示例那樣容易。
我們可以使用多個 filter()
方法,用管道符 |
分隔。結果將合併到一個模型中。
示例
返回 firstname 為 "Emil" 或 "Tobias" 的記錄
mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
執行示例 »
另一個常用方法是匯入並使用 Q 表示式
示例
返回 firstname 為 "Emil" 或 "Tobias" 的記錄
from django.http import HttpResponse
from django.template import loader
from .models import Member
from django.db.models import Q
def testing(request):
mydata = Member.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
template = loader.get_template('template.html')
context = {
'mymembers': mydata,
}
return HttpResponse(template.render(context, request))
執行示例 »
在 SQL 中,上述語句會這樣寫:
SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';
欄位查詢
Django 有自己的指定 SQL 語句和 WHERE 子句的方式。
要在 Django 中進行特定 where 子句,請使用“欄位查詢”。
欄位查詢是代表特定 SQL 關鍵字的關鍵字。
示例
使用 __startswith
關鍵字
.filter(firstname__startswith='L');
與 SQL 語句相同
WHERE firstname LIKE 'L%'
上述語句將返回 firstname 以 'L' 開頭的記錄。
欄位查詢語法
所有欄位查詢關鍵字都必須指定欄位名,後跟兩個(!)下劃線字元,然後是關鍵字。
在我們的 Member
模型中,語句會這樣寫:
示例
返回 firstname
以字母 'L' 開頭的記錄
mydata = Member.objects.filter(firstname__startswith='L').values()
執行示例 »
欄位查詢參考
所有欄位查詢關鍵字列表
關鍵字 | 描述 |
---|---|
包含 | 包含短語 |
icontains | 與 contains 相同,但忽略大小寫 |
date | 匹配日期 |
day | 匹配日期(月份,1-31)(用於日期) |
endswith | 以...結尾 |
iendswith | 與 endswith 相同,但忽略大小寫 |
exact | 精確匹配 |
iexact | 與 exact 相同,但忽略大小寫 |
in | 匹配其中一個值 |
isnull | 匹配 NULL 值 |
gt | 大於 |
gte | 大於或等於 |
hour | 匹配小時(用於 datetime) |
lt | 小於 |
lte | 小於或等於 |
minute | 匹配分鐘(用於 datetime) |
month | 匹配月份(用於日期) |
四分之一 | 匹配季度(1-4)(用於日期) |
range | 匹配範圍 |
regex | 匹配正則表示式 |
iregex | 與 regex 相同,但忽略大小寫 |
second | 匹配秒(用於 datetime) |
startswith | 以...開頭 |
istartswith | 與 startswith 相同,但忽略大小寫 |
time | 匹配時間(用於 datetime) |
week | 匹配週數(1-53)(用於日期) |
week_day | 匹配星期幾(1-7),1 為星期日 |
iso_week_day | 匹配 ISO 8601 星期幾(1-7),1 為星期一 |
year | 匹配年份(用於日期) |
iso_year | 匹配 ISO 8601 年份(用於日期) |