2012-07-07 40 views
7

Tôi muốn đếm số mục được trả lại trong bộ truy vấn của mình. Ví dụCách đếm số lượng mục trong bộ truy vấn mà không cần đếm()

userdesigns = Design.objects.filter (desadder = user.id)

Tôi muốn để có được số lượng đối tượng trở mà không sử dụng count().

Lý do là tôi đang cố gắng tăng tốc hiệu suất và giảm số lượng truy vấn cơ sở dữ liệu mà tôi thực hiện và tôi nhận thấy rằng việc sử dụng count() ping cơ sở dữ liệu mà tôi không muốn. Xem xét tôi đã kéo hoàn toàn cho phép người dùng thiết kế, không nên có một cách để chỉ đếm số lượng các mục được lưu trữ trong queryset trả về?

Trả lời

16

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> 
>>> 
+0

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

+0

Có. Tôi đã thêm một ví dụ từ django shell. –

+1

"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'. –

0

Riateche trả lời này, nhưng nếu bạn không muốn sử dụng len() hoặc .count() trực tiếp trên QuerySet, bạn có thể trả về một values_list và sử dụng len() trên đó.

Django tài liệu nói:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

Một ValuesQuerySet rất hữu ích khi bạn biết bạn sẽ chỉ cần giá trị từ một số ít các trường có sẵn và bạn sẽ không cần chức năng của đối tượng mẫu.

Tôi nghi ngờ điều này nhanh hơn, nhưng bạn luôn có thể xem và xem nhanh. Nó có thể hữu ích nếu bạn chỉ muốn trả lại một tập con của tổng số trường có sẵn trong một bảng.

Các vấn đề liên quan