2009-08-10 20 views
26

Xin lỗi, tôi hoàn toàn mới đối với Django và Python.Django - Tìm đối tượng cuối cùng được tạo, bộ lọc đồng thời

Tôi có 2 câu hỏi. Trước tiên, làm thế nào tôi sẽ đi về việc nhận được đối tượng cuối cùng được tạo ra (hoặc cao nhất pk) trong một danh sách các đối tượng? Ví dụ: tôi biết rằng tôi có thể sử dụng các mục sau để lấy đối tượng đầu tiên:

list = List.objects.all()[0] 

Có cách nào để có được độ dài List.object không? Tôi đã thử List.objects.length nhưng không có kết quả.

Thứ hai, bạn có thể tạo bộ lọc đồng thời hoặc kết hợp danh sách không? Dưới đây là một ví dụ:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number) 

Tôi muốn một cái gì đó giống như trên, nhưng nhiều hơn như:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number or home_phone=number) 

cú pháp chính xác là gì, nếu có?

Trả lời

42

Tôi đã không cố gắng này, nhưng tôi muốn nhìn vào các nhà điều hành latest() trên QuerySets:

mới nhất (field_name = Không)

Trả về đối tượng mới nhất trong bảng , theo ngày, sử dụng field_name được cung cấp dưới dạng trường ngày.

Ví dụ này trả về nhập mới nhất trong bảng, theo lĩnh vực PUB_DATE:

Entry.objects.latest ('PUB_DATE')

Nếu Meta của mô hình mà bạn chỉ định get_latest_by, bạn có thể để lại đối số field_name thành mới nhất(). Django sẽ sử dụng trường được chỉ định trong get_latest_by theo mặc định.

Giống như get(), latest() tăng DoesNotExist nếu một đối tượng không tồn tại với các tham số đã cho.

Lưu ý mới nhất() tồn tại hoàn toàn cho tiện lợi và dễ đọc.

model docs on get_latest_by:

get_latest_by

Options.get_latest_by

Tên của một DateField hoặc DateTimeField trong mô hình. Điều này chỉ định trường mặc định để sử dụng trong phương pháp mới nhất của Trình quản lý mô hình của bạn.

Ví dụ:

get_latest_by = "order_date"

Xem các tài liệu cho mới nhất() để biết thêm.

Chỉnh sửa: Wade có câu trả lời hay về toán tử Q().

+0

Cảm ơn, Hugh! Tôi cũng sẽ xem xét điều này. – zdyn

+0

Câu trả lời tuyệt vời =) Cảm ơn bạn! –

+0

@hughdbrown Làm thế nào chúng ta có thể sử dụng mới nhất trong mẫu Django ?? – MegaBytes

12

Đối với khóa chính lớn nhất, hãy thử này:

List.objects.order_by('-pk')[0] 

Lưu ý rằng việc sử dụng pk làm việc không phụ thuộc vào tên thực tế của lĩnh vực được xác định là khóa chính của bạn.

20

công trình này!

Model.objects.latest('field') - trường có thể là id. đó sẽ là id mới nhất

+8

Trông giống như câu trả lời tôi viết bốn tháng trước bạn, phải không? – hughdbrown

+4

Bạn không thực sự truyền cảm hứng cho sự tự tin với _I chưa thử điều này. Câu trả lời này có. –

0

thay thế cho các đối tượng mới nhất được tạo ra:

List.objects.all()[List.objects.count()-1] 

Nó là cần thiết để thêm một AssertionError đối với trường hợp khi không có các mục trong danh sách.

except AssertionError: 
    ... 
+2

Điều này sẽ tải tất cả các mô hình từ cơ sở dữ liệu. – wieczorek1990

9

Kể từ Django 1.6 - cuối cùng

last()

trình như first(), nhưng trả về đối tượng cuối cùng trong queryset.

Trả lại đối tượng cuối cùng phù hợp với bộ truy vấn hoặc None nếu không có đối tượng phù hợp. Nếu QuerySet không xác định thứ tự, thì queryset được tự động sắp xếp theo khóa chính.

list = List.objects.last() mang đến cho bạn đối tượng cuối cùng tạo

0

tôi đang làm việc trên phiên bản Django là 1.4.22, không last cũng không lastet đang làm việc. Cách của tôi để giải quyết với tải db tối thiểu là:

latest = lambda model_objects, field : model_objects.values_list(field, flat = True).order_by("-" + field)[ 0 ] 
latest_pk = latest(List.objects, "pk") 

Hàm này chấp nhận query_set làm đầu vào.

Bạn có thể ràng buộc chức năng này tự động bằng cách thực hiện:

import types 
List.objects.latest = types.MethodType(latest, List.objects) 

Sau đó, bạn sẽ có thể để có được những đối tượng cuối bởi pk mới nhất này một cách dễ dàng.

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