특정 쿼리 세트에서 마지막 레코드를 검색하려면 어떻게해야합니까?
답변:
편집 : 이제 사용해야합니다 Entry.objects.latest('pub_date')
다음을 사용하여 다음과 같이 간단히 할 수 있습니다 reverse()
.
queryset.reverse()[0]
또한 Django 문서에서이 경고를주의하십시오.
...
reverse()
일반적으로 정의 된 순서가있는 QuerySet에서만 호출되어야합니다 (예 : 기본 순서를 정의하는 모델에 대해 쿼리 할 때 또는를 사용할 때order_by()
). 지정된에 대해 이러한 순서가 정의되지 않은 경우QuerySet
호출reverse()
해도 실제 효과가 없습니다 (순서는 호출 전에 정의되지 않았고reverse()
나중에 정의되지 않은 상태로 유지됩니다).
장고 문서 :
latest(field_name=None)
날짜 필드로 제공된 field_name을 사용하여 날짜별로 테이블의 최신 개체를 반환합니다.이 예는
pub_date
필드 에 따라 테이블의 최신 항목을 반환합니다 .
Entry.objects.latest('pub_date')
가장 간단한 방법은 다음과 같습니다.
books.objects.all().last()
또한 이것을 사용하여 다음과 같이 첫 번째 항목을 가져옵니다.
books.objects.all().first()
books.objects.last()
및 books.objects.first()
트릭을 할해야합니다.
XYZ.objects.first()
하고 XYZ.objects.last()
장고> = 1.6
필터와 일치하는 첫 번째 또는 마지막 개체를 반환하는 편리한 메서드 인 QuerySet 메서드 first () 및 last ()를 추가했습니다. 일치하는 개체가 없으면 None을 반환합니다.
쿼리 세트가 이미 소진 된 경우 다른 db 힌트를 피하기 위해 이렇게 할 수 있습니다.
last = queryset[len(queryset) - 1] if queryset else None
사용하지 마십시오 try...except...
. 이 경우
장고는 던지지 않습니다 IndexError
.
그것은 발생 AssertionError
또는 ProgrammingError
(당신이 -O 옵션으로 파이썬을 실행할 때)
django 1.6 이상을 사용하는 경우 새 API가 도입되어 훨씬 쉬워졌습니다.
Model.object.earliest()
역방향으로 latest ()를 제공합니다.
추신-나는 그것의 오래된 질문을 알고, 누군가 가이 질문에 착수하는 것처럼 게시하고, 그들은이 새로운 기능을 알게되고 오래된 방법을 사용하지 않습니다.
당신은 사용할 수 있습니다 Model.objects.last()
또는 Model.objects.first()
. ordering
정의 되지 않은 경우 쿼리 세트는 기본 키를 기준으로 정렬됩니다. 주문 동작 쿼리 셋을 원한다면 마지막 두 지점을 참조 할 수 있습니다.
이 작업을 수행하려는 경우 Model.objects.all().last()
마지막 검색 및 Model.objects.all().first()
쿼리 세트의 첫 번째 요소를 검색하거나 filters
두 번째 생각없이 사용 합니다. 그런 다음 아래의 몇 가지주의 사항을 참조하십시오.
여기서 주목해야 할 중요한 부분은 ordering
모델에 데이터를 포함하지 않은 경우 데이터가 임의의 순서로있을 수 있으며 예상치 못한 임의의 마지막 또는 첫 번째 요소가 있다는 것입니다.
예 : 하자 당신이 모델 이름을 밝혔 Model1
2 열이있는 id
및item_count
(10)에 ID 1을 가진 10 행으로 [정의 된 순서가 없습니다]
이렇게 Model.objects.all (). last ()를 가져 오면 10 개 요소 목록에서 원하는 요소를 가져올 수 있습니다. 예, 기본 주문이 없으므로 무작위입니다.
그래서 무엇을 할 수 있습니까?
ordering
모델의 모든 필드를 기반으로 정의 할 수 있습니다 . 성능 문제도 있으므로 확인하시기 바랍니다. 참고 : 여기order_by
가져 오는 동안 사용할 수 있습니다 . 이렇게 :Model.objects.order_by('item_count').last()
현재 순서에 대해 걱정할 필요없이 가장 간단한 방법은 Python의 일반적인 음수 인덱싱을 사용할 수 있도록 QuerySet을 목록으로 변환하는 것입니다. 이렇게 :
list(User.objects.all())[-1]