Làm cách nào để truy xuất bản ghi cuối cùng trong một bộ truy vấn nhất định?
Câu trả lời:
CHỈNH SỬA: Bây giờ bạn phải sử dụng Entry.objects.latest('pub_date')
Bạn có thể đơn giản làm điều gì đó như thế này, sử dụng reverse()
:
queryset.reverse()[0]
Ngoài ra, hãy cẩn thận cảnh báo này từ tài liệu Django:
... lưu ý rằng
reverse()
thường chỉ được gọi trên QuerySet có thứ tự xác định (ví dụ: khi truy vấn đối với mô hình xác định thứ tự mặc định hoặc khi sử dụngorder_by()
). Nếu không có thứ tự nào như vậy được xác định cho một thứ nhất địnhQuerySet
, việc gọireverse()
nó sẽ không có tác dụng thực sự (thứ tự không được xác định trước khi gọireverse()
và sẽ vẫn không được xác định sau đó).
latest(field_name=None)
trả về đối tượng mới nhất trong bảng, theo ngày, sử dụng field_name được cung cấp làm trường ngày.Ví dụ này trả về Mục nhập mới nhất trong bảng, theo
pub_date
trường:
Entry.objects.latest('pub_date')
Cách đơn giản nhất để làm điều đó là:
books.objects.all().last()
Bạn cũng sử dụng điều này để có được mục nhập đầu tiên như vậy:
books.objects.all().first()
books.objects.last()
và books.objects.first()
nên thực hiện thủ thuật.
XYZ.objects.first()
và XYZ.objects.last()
Django> = 1,6
Đã thêm các phương thức QuerySet first () và last () là các phương thức tiện lợi trả về đối tượng đầu tiên hoặc cuối cùng phù hợp với bộ lọc. Trả về Không nếu không có đối tượng nào phù hợp.
Để lấy đối tượng Đầu tiên:
ModelName.objects.first()
Để lấy các đối tượng cuối cùng:
ModelName.objects.last()
Bạn có thể sử dụng bộ lọc
ModelName.objects.filter(name='simple').first()
Điều này làm việc cho tôi.
Khi bộ truy vấn đã hết, bạn có thể làm điều này để tránh một gợi ý db khác -
last = queryset[len(queryset) - 1] if queryset else None
Không sử dụng try...except...
.
Django không ném IndexError
vào trường hợp này.
Nó ném AssertionError
hoặc ProgrammingError
(khi bạn chạy python với tùy chọn -O)
Nếu sử dụng django 1.6 trở lên, việc này sẽ dễ dàng hơn nhiều khi api mới được giới thiệu -
Model.object.earliest()
Nó sẽ cho kết quả mới nhất () với hướng ngược lại.
ps - Tôi biết câu hỏi cũ của nó, tôi đăng bài như thể sẽ có ai đó tiếp cận câu hỏi này, họ sẽ biết tính năng mới này và không kết thúc bằng phương pháp cũ.
Bạn có thể sử dụng Model.objects.last()
hoặc Model.objects.first()
. Nếu không có nào ordering
được xác định thì tập truy vấn được sắp xếp dựa trên khóa chính. Nếu bạn muốn đặt hàng truy vấn hành vi thì bạn có thể tham khảo hai điểm cuối cùng.
Nếu bạn đang suy nghĩ để làm điều này, Model.objects.all().last()
để truy xuất cuối cùng và Model.objects.all().first()
truy xuất phần tử đầu tiên trong bộ truy vấn hoặc sử dụngfilters
mà không cần suy nghĩ thứ hai. Sau đó, hãy xem một số lưu ý dưới đây.
Phần quan trọng cần lưu ý ở đây là nếu bạn chưa đưa bất kỳ phần tử nào ordering
vào mô hình của mình, dữ liệu có thể theo bất kỳ thứ tự nào và bạn sẽ có phần tử cuối cùng hoặc phần tử đầu tiên ngẫu nhiên không được mong đợi.
Ví dụ. Giả sử bạn có một mô hình được đặt tên Model1
có 2 cột id
vàitem_count
10 hàng có id từ 1 đến 10. [Không có thứ tự nào được xác định]
Nếu bạn tìm nạp Model.objects.all (). Last () như thế này, Bạn có thể lấy bất kỳ phần tử nào từ danh sách 10 phần tử. Có, nó là ngẫu nhiên vì không có thứ tự mặc định.
Vậy thì cái gì có thể làm được?
ordering
dựa trên bất kỳ trường nào hoặc các trường trên mô hình của bạn. Nó cũng có vấn đề về hiệu suất, Vui lòng kiểm tra điều đó. Tham khảo: Tại đâyorder_by
trong khi tìm nạp. Như thế này:Model.objects.order_by('item_count').last()
Cách đơn giản nhất, mà không phải lo lắng về thứ tự hiện tại, là chuyển QuerySet thành một danh sách để bạn có thể sử dụng lập chỉ mục phủ định thông thường của Python. Như vậy:
list(User.objects.all())[-1]