2009-06-02 3 views
6

날짜/시간 필드에 의해 정렬 된 Foo 모델에서 최신 5 개의 행을 가져옵니다. 다음 단계 django - 그것을 자른 후 쿼리 세트 재정렬

qs = Foo.objects.all()[:5] 

, 난 (실제로는 반대 방향으로 동일한 날짜 필드에 의해) 몇몇 다른 기준에 의해의 검색어의 순서를 원한다. 그러나 슬라이스 후 재정렬은 허용되지 않습니다. reverse()는 첫 번째 순서를 취소하고 나에게 다른 queryset을 준다. 쿼리 세트에서 목록을 작성하지 않고 원하는 것을 성취하고이를 사용하여 주문을 수행하는 방법이 있습니까?

답변

10

아니요, 그렇게 할 방법이 없습니다. order_by은 데이터베이스에 대한 연산이지만 쿼리 세트를 슬라이스하면 평가되고 그 후에 데이터베이스로 돌아 가지 않습니다.

당신은 이미 해결책을 알고있는 것처럼 들리지만, 평가 된 qs에 reversed()을 실행하십시오.

qs = reversed(Foo.objects.all()[:5]) 
+0

그래서 나는 아무것도 놓치지 않았습니다. 감사. – shanyu

+0

나는 같은 문제가 있었고 Daniel 제안을 따랐지만 쿼리 세트에서 카운트 방법을 사용할 수 없다는 사실을 발견했습니다 – thchand

+0

제공 할 수있는 링크 인 Python 문서에서 reversed()에 대한 참조를 찾을 수 없습니까? –

13

order_by는 SQL 데이터베이스 내 주문을 제공합니다. 당신은 이미 그것을 사용하고 있습니다. 이 시점에서 결과는 메모리로 검색됩니다. 순서를 변경하려면 ORM 데이터베이스 내 정렬이 아닌 파이썬 메모리 내 정렬을 사용해야합니다. 당신은 단순히 같은 필드를 기준으로 정렬 할 때문에, 그러나 다른 순서로, 당신이 가지고있는 목록 역 : 귀하의 경우

은, 다니엘은 이미 최적의 솔루션을 제공하고있다 당신이 있다면

qs = Foo.objects.all()[:5] 
objs = reversed(qs) 

을 다음 사용자 정의 키 기능을 정렬() 함수를 사용하는 것, 다른 필드를 기준으로 정렬하고 싶었 :

qs = Foo.objects.all()[:5] 
objs = sorted(qs, key=lambda o: o.some_other_field) 
+0

예, order_by는 DB 주문입니다. 그러나 슬라이스 후 reverse() (queryset 메서드)가 작동하고 쿼리를 다시 실행하여 예기치 않은 결과가 발생한다는 사실이 흥미 롭습니다. – shanyu

+0

쿼리 집합에서 결과를 가져올 때 여전히 유효한 쿼리 집합입니다. 이를 수정하면 (예 : reverse()를 추가하면 다시 평가됩니다). –

1

늦은 대답하지만, 이것은 단지 나를 위해 일한 :

import random 
sorted(queryset[:10], key=lambda x: random.random())