Chọn theo việc bạn sẽ làm tiếp với dữ liệu, vì QuerySet chỉ chạy query khi bị đánh giá và cache kết quả sau lần đánh giá đầu tiên.
- Chỉ cần biết có hay không →
qs.exists(). SQL sinh ra làSELECT 1 ... LIMIT 1, không kéo dòng nào về Python. - Chỉ cần số lượng →
qs.count()→SELECT COUNT(*), database đếm, không tải object. - Sẽ duyệt qua toàn bộ dữ liệu ngay sau đó → cứ
if qs:hoặclen(qs). Lúc này QuerySet được đánh giá đầy đủ, kết quả nằm trong cache nội bộ, nên vòng lặp phía sau không tốn thêm query.
python
if Order.objects.filter(user=user).exists(): # cheapest existence check
...
orders = Order.objects.filter(user=user)
if orders: # evaluates and fills the cache
for o in orders: # no second query
...Sai lầm hay gặp: gọi qs.exists() rồi ngay sau đó lặp qua qs — thành 2 query.
Hoặc ngược lại, dùng len(qs) chỉ để kiểm tra rỗng trên bảng lớn — kéo toàn bộ dòng về vô ích.