Nhận bản ghi mới nhất với bộ lọc trong Django


90

Tôi đang cố gắng lấy đối tượng mô hình Django mới nhất nhưng dường như không thể thành công.

Cả hai đều không hoạt động:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)

3
Bạn đã thử:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine

@catherine, làm việc như một sự quyến rũ! : D. bạn muốn viết cái này dưới dạng câu trả lời để tôi có thể kiểm tra nó?
doniyor

Trong năm 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Hy vọng nó giúp.
Ngatia Frankline

Câu trả lời:


101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]

10
@DaveMerwin nó không sai; có nhiều cách để giải quyết vấn đề này và cả câu trả lời này và câu trả lời kia đều đúng.
Jordan

1
Lưu ý rằng điều này tạo ra giả định rằng id là một số nguyên khóa chính được sắp xếp theo trình tự. Đây thường là mặc định cho django, nhưng đôi khi không.
dalore

2
Điều này có thể nguy hiểm vì bộ lọc có thể trả về một danh sách trống
Kingston Chan

'-id' được sử dụng để đảo ngược thứ tự!
Indra

3
có thể .first () thay vì [0]?
fevgenym

119

Xem tài liệu từ django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Bạn cần chỉ định một trường trong new (). ví dụ.

obj= Model.objects.filter(testfield=12).latest('testfield')

Hoặc nếu Meta của mô hình của bạn chỉ định get_latest_by, bạn có thể bỏ qua field_nameđối số earliest() or latest(). Django sẽ sử dụng trường được chỉ định get_latest_bytheo mặc định.


2
"Trường thử nghiệm" có phải là trường ngày tháng không?
tani-rokk


17

latestthực sự được thiết kế để hoạt động với các trường ngày tháng (nó có thể cũng hoạt động với các loại được sắp xếp theo tổng số khác, nhưng không chắc chắn). Và cách duy nhất bạn có thể sử dụng nó mà không cần chỉ định tên trường là đặt get_latest_bythuộc tính meta, như đã đề cập ở đây .


8
Nó hoạt động với các khóa chính, bạn luôn có thể làm điều gì đó như sau:Model.objects.latest('id')
Ander

6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] là giải pháp đúng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.