len(). Một QuerySet được đánh giá khi bạn gọi len() trên đó. Điều này, như bạn có thể mong đợi, trả về độ dài của danh sách kết quả.
Lưu ý: Không sử dụng len() trên QuerySets nếu tất cả những gì bạn muốn làm là xác định số lượng bản ghi trong tập hợp. Đó là hiệu quả hơn nhiều để xử lý một số ở cấp cơ sở dữ liệu, bằng cách sử dụng SELECT SELECT (*), và Django cung cấp một phương thức count() vì lý do chính xác này. Xem số đếm() bên dưới.
Source
Vì vậy, nếu bạn gọi len(userdesigns)
thay vì userdesigns.count()
, django sẽ yêu cầu tất cả các dữ liệu liên quan từ bảng trong một truy vấn duy nhất. Sau đó, bạn có thể truy cập tất cả các mục của biến số userdesigns
, sẽ không có truy vấn bổ sung nào được thực hiện.
>>> m = Model1.objects.filter(desadder=1)
>>> len(m)
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,)
2
>>> m[0]
<Model1: Model1 object>
>>> m = Model1.objects.filter(desadder=1)
>>> len(m)
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,)
2
>>> m[0]
<Model1: Model1 object>
>>>
Nguồn
2012-07-07 19:24:28
Thú vị. Vì vậy, bạn đang nói rằng thay vì chạy truy vấn của tôi ở trên, thay vào đó tôi chỉ có thể sử dụng 'len()' từ get-go và tất cả các mục trong 'userdesigns' sẽ đi cùng cho chuyến đi? – user1328021
Có. Tôi đã thêm một ví dụ từ django shell. –
"Lý do là tôi đang cố gắng tăng tốc hiệu suất và giảm số truy vấn cơ sở dữ liệu mà tôi thực hiện" => rồi học cách sử dụng 'Queryset.select_related'. –