2009-06-02 24 views
6

Tôi tìm nạp 5 hàng mới nhất từ ​​một mô hình Foo được sắp xếp theo trường datetime.django - sắp xếp lại bộ truy vấn sau khi cắt nó

qs = Foo.objects.all()[:5] 

Trong bước tiếp theo, tôi muốn sắp xếp lại truy vấn bằng một số tiêu chí khác (thực tế, theo cùng trường ngày giờ theo hướng ngược lại). Nhưng sắp xếp lại sau khi một lát không được phép. reverse() undoes thứ tự đầu tiên, cho tôi một queryet differet. Có cách nào để thực hiện những gì tôi muốn mà không cần tạo một danh sách từ queryset và làm theo thứ tự sử dụng nó?

Trả lời

10

Không, không có cách nào để thực hiện việc đó. order_by là một hoạt động trên cơ sở dữ liệu, nhưng khi bạn cắt một queryset nó được đánh giá và không quay trở lại cơ sở dữ liệu sau đó.

Có vẻ như bạn đã biết giải pháp: chạy reversed() trên qs được đánh giá.

qs = reversed(Foo.objects.all()[:5]) 
+0

Vì vậy, tôi đã không bỏ lỡ bất cứ điều gì. Cảm ơn. – shanyu

+0

Tôi có cùng một vấn đề và theo Daniel đề nghị nhưng thấy rằng tôi không thể sử dụng phương pháp đếm trên queryset – thchand

+0

Không thể tìm thấy tham chiếu đến đảo ngược() trong tài liệu python, bất kỳ liên kết bạn có thể cung cấp? –

13

order_by cung cấp cho bạn thứ tự SQL trong cơ sở dữ liệu. Bạn đã sử dụng nó rồi cắt nó. Tại thời điểm đó, kết quả được lấy vào bộ nhớ. Nếu bạn muốn thay đổi thứ tự của chúng, bạn cần sử dụng phân loại trong bộ nhớ Python để làm điều đó, không phải là sắp xếp trong cơ sở dữ liệu ORM.

Trong trường hợp của bạn, Daniel đã đưa ra giải pháp tốt nhất: kể từ khi bạn chỉ đơn giản là muốn sắp xếp theo lĩnh vực tương tự, nhưng theo thứ tự khác, chỉ cần đảo ngược danh sách bạn có:

qs = Foo.objects.all()[:5] 
objs = reversed(qs) 

Nếu bạn đã có muốn sắp xếp theo một số lĩnh vực khác, sau đó bạn muốn sử dụng chức năng sắp xếp() với một chức năng tùy chỉnh quan trọng:

qs = Foo.objects.all()[:5] 
objs = sorted(qs, key=lambda o: o.some_other_field) 
+0

Có, tôi biết rằng order_by là một thứ tự DB. Nhưng tôi đã tìm thấy nó thú vị là một phương thức reverse() (phương thức queryset) sau khi slice đang làm việc và nó trả lời lại truy vấn, đưa ra các kết quả không mong muốn. – shanyu

+0

Khi bạn lấy kết quả từ một queryset, nó vẫn là một queryset hợp lệ. Nếu bạn sửa đổi nó (ví dụ, bằng cách thêm đảo ngược()), nó sẽ đánh giá lại nó. –

1

Cuối câu trả lời, nhưng điều này chỉ làm việc cho tôi:

import random 
sorted(queryset[:10], key=lambda x: random.random()) 
Các vấn đề liên quan