Bộ truy vấn Django - Bộ lọc
Bộ lọc bộ truy vấn
Phương thức filter()
được sử dụng để lọc tìm kiếm của bạn và cho phép bạn chỉ trả về những hàng khớp với cụm từ tìm kiếm.
Như chúng ta đã học ở chương trước, chúng ta có thể lọc tên trường như thế này:
Ví dụ
Chỉ trả lại các bản ghi có tên là 'Emil':
mydata = Member.objects.filter(firstname='Emil').values()
Chạy ví dụ »Trong SQL, câu lệnh trên sẽ được viết như sau:
SELECT * FROM members WHERE firstname = 'Emil';
VÀ
Phương thức filter()
lấy các đối số là **kwargs (đối số từ khóa), do đó bạn có thể lọc trên nhiều trường bằng cách phân tách chúng bằng dấu phẩy.
Ví dụ
Trả về các bản ghi có họ là "Refsnes" và id là 2:
mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
Chạy ví dụ »Trong SQL, câu lệnh trên sẽ được viết như sau:
SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;
HOẶC
Để trả về các bản ghi có tên là Emil hoặc tên là Tobias (có nghĩa là: trả về các bản ghi khớp với một trong hai truy vấn, không nhất thiết phải là cả hai) không dễ như ví dụ AND ở trên.
Chúng ta có thể sử dụng nhiều phương thức filter()
, được phân tách bằng dấu gạch đứng |
tính cách. Kết quả sẽ hợp nhất thành một mô hình.
Ví dụ
Trả về các bản ghi có tên là "Emil" hoặc Tobias":
mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
Chạy ví dụ »Một phương pháp phổ biến khác là nhập và sử dụng biểu thức Q:
Ví dụ
Trả về các bản ghi có tên là "Emil" hoặc 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))
Chạy ví dụ »Trong SQL, câu lệnh trên sẽ được viết như sau:
SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';
Tra cứu trường
Django có cách riêng để chỉ định các câu lệnh SQL và mệnh đề WHERE.
Để đưa ra các mệnh đề cụ thể ở Django, hãy sử dụng "Tra cứu trường".
Tra cứu trường là các từ khóa đại diện cho các từ khóa SQL cụ thể.
Ví dụ:
Sử dụng từ khóa __startswith
:
.filter(firstname__startswith='L');
Tương tự như câu lệnh SQL:
WHERE firstname LIKE 'L%'
Câu lệnh trên sẽ trả về các bản ghi trong đó tên bắt đầu bằng 'L'.
Cú pháp tra cứu trường
Tất cả các từ khóa tra cứu Trường phải được chỉ định bằng tên trường, theo sau là hai ký tự gạch dưới (!) Và từ khóa.
Trong mô hình Member
của chúng tôi, câu lệnh sẽ được viết như sau:
Ví dụ
Trả về các bản ghi có firstname
bắt đầu bằng chữ 'L':
mydata = Member.objects.filter(firstname__startswith='L').values()
Chạy ví dụ »Tham chiếu tra cứu trường
Danh sách tất cả các từ khóa tra cứu trường:
Keyword | Description |
---|---|
contains | Contains the phrase |
icontains | Same as contains, but case-insensitive |
date | Matches a date |
day | Matches a date (day of month, 1-31) (for dates) |
endswith | Ends with |
iendswith | Same as endswidth, but case-insensitive |
exact | An exact match |
iexact | Same as exact, but case-insensitive |
in | Matches one of the values |
isnull | Matches NULL values |
gt | Greater than |
gte | Greater than, or equal to |
hour | Matches an hour (for datetimes) |
lt | Less than |
lte | Less than, or equal to |
minute | Matches a minute (for datetimes) |
month | Matches a month (for dates) |
quarter | Matches a quarter of the year (1-4) (for dates) |
range | Match between |
regex | Matches a regular expression |
iregex | Same as regex, but case-insensitive |
second | Matches a second (for datetimes) |
startswith | Starts with |
istartswith | Same as startswith, but case-insensitive |
time | Matches a time (for datetimes) |
week | Matches a week number (1-53) (for dates) |
week_day | Matches a day of week (1-7) 1 is sunday |
iso_week_day | Matches a ISO 8601 day of week (1-7) 1 is monday |
year | Matches a year (for dates) |
iso_year | Matches an ISO 8601 year (for dates) |