Trong quá trình phát triển web với Django, việc truy vấn dữ liệu hiệu quả là kỹ năng sống còn. Django cung cấp một công cụ cực kỳ mạnh mẽ gọi là Field Lookups. Đây chính là cách bạn tạo ra các câu lệnh WHERE trong SQL một cách linh hoạt chỉ bằng code Python.
1. Cú pháp cơ bản của Field Lookups
Trong Django ORM, các toán tử lookup luôn đi sau tên trường và được ngăn cách bởi hai dấu gạch dưới (__):
2. Bảng Tổng Hợp Các Toán Tử Lookup Phổ Biến
Dưới đây là bảng tra cứu nhanh các toán tử bạn sẽ thường xuyên sử dụng trong các dự án thực tế:
|
Toán tử |
Ý nghĩa |
Ví dụ (Django ORM) |
Tương ứng SQL |
|
exact |
Khớp chính xác (mặc định) |
name__exact='Django' |
= 'Django' |
|
iexact |
Khớp chính xác (không phân biệt hoa/thường) |
name__iexact='django' |
LIKE 'django' |
|
contains |
Chứa chuỗi (phân biệt hoa thường) |
title__contains='Web' |
LIKE BINARY '%Web%' |
|
icontains |
Chứa chuỗi (không phân biệt hoa thường) |
title__icontains='web' |
LIKE '%web%' |
|
in |
Nằm trong một danh sách |
id__in=[1, 5, 10] |
IN (1, 5, 10) |
|
gt |
Lớn hơn (Greater than) |
price__gt=100 |
> 100 |
|
gte |
Lớn hơn hoặc bằng |
price__gte=100 |
>= 100 |
|
lt |
Nhỏ hơn (Less than) |
stock__lt=10 |
< 10 |
|
lte |
Nhỏ hơn hoặc bằng |
stock__lte=10 |
<= 10 |
|
startswith |
Bắt đầu với... |
code__startswith='APP' |
LIKE 'APP%' |
|
endswith |
Kết thúc với... |
email__endswith='.com' |
LIKE '%.com' |
|
range |
Nằm trong khoảng |
date__range=(start, end) |
BETWEEN ... AND ... |
|
isnull |
Kiểm tra giá trị NULL |
deleted_at__isnull=True |
IS NULL |
|
regex |
Khớp biểu thức chính quy |
phone__regex=r'^\d{10}$' |
REGEXP ... |
3. Truy vấn nâng cao với DateTime
Django cho phép bạn "mổ xẻ" các trường ngày tháng cực kỳ đơn giản mà không cần dùng hàm SQL phức tạp:
-
year: pub_date__year=2026 (Lọc theo năm)
-
month: pub_date__month=4 (Lọc theo tháng)
-
day: pub_date__day=16 (Lọc theo ngày)
-
week_day: pub_date__week_day=2 (Lọc theo thứ trong tuần)
4. Một số lưu ý để tối ưu hiệu suất (Tips)
-
Dấu gạch dưới kép (__): Lỗi phổ biến nhất là chỉ dùng một dấu gạch dưới. Hãy luôn nhớ dùng hai dấu để Django nhận diện đúng toán tử.
-
Toán tử i (Ignore Case): Các toán tử như icontains, iexact rất tiện lợi nhưng có thể làm chậm tốc độ truy vấn trên các bảng dữ liệu lớn (Big Data). Nếu có thể, hãy chuẩn hóa dữ liệu về chữ thường trước khi lưu.
Kết hợp nhiều điều kiện: Bạn có thể dùng Q objects để thực hiện các phép toán phức tạp như OR, NOT:
# Tìm bài viết có tag là 'Python' HOẶC 'Django'
Post.objects.filter(Q(tag='Python') | Q(tag='Django'))
Việc nắm vững các toán tử Lookup giúp bạn viết code sạch hơn, dễ bảo trì và tận dụng tối đa sức mạnh của Django ORM. Hy vọng bảng tổng hợp này sẽ giúp ích cho các bạn trong quá trình coding hàng ngày!
Chúc các bạn thành công