2012-02-25 31 views
5

Tôi đang chạy truy vấn để nhận 5 mục News mới nhất. Trong mẫu của tôi, tôi muốn hiển thị mục đầu tiên ở một vị trí, sau đó 4 mục còn lại ở phía dưới trang.Cách tốt nhất để cắt truy vấn Django mà không cần nhấn cơ sở dữ liệu nhiều hơn một lần

Trong mẫu của tôi, tôi làm điều gì đó như thế này:

{% for n in news|slice:":1" %} 
    {{ n.headline }} 
{% endfor %} 

... more HTML ... 

{% for n in news|slice:"1:" %} 
    {{ n.headline }} 
{% endfor %} 

Khi tôi nhìn vào trong Toolbar Debug, kết quả này trong hai truy vấn cơ sở dữ liệu: một với LIMIT 1 và khác với LIMIT 4 OFFSET 1, nhưng nếu không cùng . Tôi đánh giá cao đây là cách của Django thông minh chỉ yêu cầu những thứ bạn thực sự sử dụng, nhưng trong trường hợp này có vẻ hơi quá mức. Cách tốt nhất để làm điều này là gì?

+0

Từ quan điểm của người lập trình, bạn chắc chắn đang gọi một vòng lặp 'for' hai lần và cả hai được đặt thành một mẫu gọi một truy vấn. Bạn có thể lấy tất cả 5 cùng một lúc, lưu trữ nó trên máy khách và hiển thị nội dung của một bản sao được lưu trong bộ nhớ cache thay vào đó không? – Droogans

+0

tốt, đó là những gì tôi đang cố gắng làm. Theo quan điểm, tôi lấy tất cả 5, nhưng queryset chỉ đánh giá khi tôi cố gắng cắt đầu tiên 1. Bạn nói đúng, vòng lặp đầu tiên không thực sự cần phải là vòng lặp vì nó chỉ có 1 mục. –

Trả lời

5

Bạn chỉ cần buộc bộ truy vấn tự đánh giá trước lát. Điều này có thể được thực hiện đơn giản bằng cách gọi len() trên đó theo quan điểm của bạn trước khi chuyển nó tới ngữ cảnh.

Tài liệu Django có số complete list of everything that causes a queryset to evaluate. Chỉ cần làm một cái gì đó từ danh sách đó và bạn tốt.

9

Chuyển đổi thành chuỗi trong chế độ xem, sau đó cắt chuỗi.

var = list(somequery[:5]) 
+0

Bạn có nghĩa là '' var = list (somequery) [: 5] ''? –

+4

@Riley: Không. Nó truy lục * tất cả * bản ghi và sau đó cắt 5 đầu tiên, trong khi những gì tôi đã viết lấy 5 đầu tiên và cho phép mẫu cắt đầu tiên. –

+0

Ah, tôi hiểu ý của bạn là gì. Tôi nghĩ rằng từ ngữ đã ném tôi đi. –

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