쿼리 세트에서 마지막 레코드 가져 오기


답변:


81

편집 : 이제 사용해야합니다 Entry.objects.latest('pub_date')


다음을 사용하여 다음과 같이 간단히 할 수 있습니다 reverse().

queryset.reverse()[0]

또한 Django 문서에서이 경고를주의하십시오.

... reverse()일반적으로 정의 된 순서가있는 QuerySet에서만 호출되어야합니다 (예 : 기본 순서를 정의하는 모델에 대해 쿼리 할 때 또는를 사용할 때 order_by()). 지정된에 대해 이러한 순서가 정의되지 않은 경우 QuerySet호출 reverse()해도 실제 효과가 없습니다 (순서는 호출 전에 정의되지 않았고 reverse()나중에 정의되지 않은 상태로 유지됩니다).


2
django 문서에서 말했듯이 : "reverse ()는 일반적으로 정의 된 순서를 가진 QuerySet에서만 호출되어야합니다 (예 : 기본 순서를 정의하는 모델에 대해 쿼리 할 때 또는 order_by ()를 사용할 때). 이러한 순서는 주어진 QuerySet에 대해 정의되며 reverse ()를 호출하는 것은 실제 효과가 없습니다 (순서는 reverse ()를 호출하기 전에 정의되지 않았으며 나중에 정의되지 않은 상태로 유지됩니다). "
jujule 2010

6
2017 및 수락 된 답변은 현재 구식입니다. 아래와 같이 queryset.last ()를 사용해야합니다.
wobbily_col

134

장고 문서 :

latest(field_name=None) 날짜 필드로 제공된 field_name을 사용하여 날짜별로 테이블의 최신 개체를 반환합니다.

이 예는 pub_date필드 에 따라 테이블의 최신 항목을 반환합니다 .

Entry.objects.latest('pub_date')

5
이것은 그것을하는 깔끔한 방법입니다. 또한 "모델의 메타가 get_latest_by를 지정하면, 문서에 따라 field_name 인수를 latest ()로 남겨 둘 수 있습니다."
Fredrik Möllerstrand 2013 년

50

가장 간단한 방법은 다음과 같습니다.

books.objects.all().last()

또한 이것을 사용하여 다음과 같이 첫 번째 항목을 가져옵니다.

books.objects.all().first()

16
books.objects.last() books.objects.first()트릭을 할해야합니다.
이것을 Chandan

이것은 허용 답변과 함께해야 XYZ.objects.first()하고 XYZ.objects.last()
slajma

나는 Arnaud P의 방식이 더 적절하다고 생각합니다. 실수가 아니라면 나중에 DB 쿼리를 사용하여 마지막으로 가져 오는 DB의 모든 항목을 압축 해제합니다.
Larcho

33

장고> = 1.6

필터와 일치하는 첫 번째 또는 마지막 개체를 반환하는 편리한 메서드 인 QuerySet 메서드 first () 및 last ()를 추가했습니다. 일치하는 개체가 없으면 None을 반환합니다.


32

First 개체를 얻으려면 :

ModelName.objects.first()

마지막 개체를 가져 오려면 :

ModelName.objects.last()

필터를 사용할 수 있습니다

ModelName.objects.filter(name='simple').first()

이것은 나를 위해 작동합니다.


6

쿼리 세트가 이미 소진 된 경우 다른 db 힌트를 피하기 위해 이렇게 할 수 있습니다.

last = queryset[len(queryset) - 1] if queryset else None

사용하지 마십시오 try...except.... 이 경우
장고는 던지지 않습니다 IndexError.
그것은 발생 AssertionError또는 ProgrammingError(당신이 -O 옵션으로 파이썬을 실행할 때)


1
쿼리 셋이 이미 주문되었다고 가정하면 이것이 데이터베이스를 다시 공격하지 않는 유일한 솔루션이기 때문에 "최상위 답변"이되어야합니다.
David D.

4

django 1.6 이상을 사용하는 경우 새 API가 도입되어 훨씬 쉬워졌습니다.

Model.object.earliest()

역방향으로 latest ()를 제공합니다.

추신-나는 그것의 오래된 질문을 알고, 누군가 가이 질문에 착수하는 것처럼 게시하고, 그들은이 새로운 기능을 알게되고 오래된 방법을 사용하지 않습니다.


3
문서에서 : earliest () 및 latest ()에는 모델에서 field_name 매개 변수 또는 'get_latest_by'가 필요합니다.
panchicore

1

당신은 사용할 수 있습니다 Model.objects.last()또는 Model.objects.first(). ordering정의 되지 않은 경우 쿼리 세트는 기본 키를 기준으로 정렬됩니다. 주문 동작 쿼리 셋을 원한다면 마지막 두 지점을 참조 할 수 있습니다.

이 작업을 수행하려는 경우 Model.objects.all().last()마지막 검색 및 Model.objects.all().first()쿼리 세트의 첫 번째 요소를 검색하거나 filters두 번째 생각없이 사용 합니다. 그런 다음 아래의 몇 가지주의 사항을 참조하십시오.

여기서 주목해야 할 중요한 부분은 ordering모델에 데이터를 포함하지 않은 경우 데이터가 임의의 순서로있을 수 있으며 예상치 못한 임의의 마지막 또는 첫 번째 요소가 있다는 것입니다.

예 : 하자 당신이 모델 이름을 밝혔 Model12 열이있는 iditem_count (10)에 ID 1을 가진 10 행으로 [정의 된 순서가 없습니다]

이렇게 Model.objects.all (). last ()를 가져 오면 10 개 요소 목록에서 원하는 요소를 가져올 수 있습니다. 예, 기본 주문이 없으므로 무작위입니다.

그래서 무엇을 할 수 있습니까?

  1. ordering모델의 모든 필드를 기반으로 정의 할 수 있습니다 . 성능 문제도 있으므로 확인하시기 바랍니다. 참고 : 여기
  2. 또는 order_by가져 오는 동안 사용할 수 있습니다 . 이렇게 :Model.objects.order_by('item_count').last()

-5

현재 순서에 대해 걱정할 필요없이 가장 간단한 방법은 Python의 일반적인 음수 인덱싱을 사용할 수 있도록 QuerySet을 목록으로 변환하는 것입니다. 이렇게 :

list(User.objects.all())[-1]

2
이것은 DB에서 모든 개체를 쿼리 한 다음 첫 번째 개체를 가져옵니다
warvariuc

좋은 지적! 분명히 그것을 통해 생각하지 않았습니다. .reverse () 답변 (현재 선택됨)이 올바른 방법입니다!
Josh Ourisman 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.