장고-쿼리 결과 제한


답변:


304

장고 쿼리 셋은 게으르다. 즉, 결과를 구체적으로 요청할 때만 쿼리가 데이터베이스에 도달합니다.

따라서 쿼리 결과를 인쇄하거나 실제로 사용할 때까지 데이터베이스 액세스없이 추가로 필터링 할 수 있습니다.

아래에서 볼 수 있듯이 코드는 하나의 SQL 쿼리 만 실행하여 마지막 10 개의 항목 만 가져옵니다.

In [19]: import logging                                 
In [20]: l = logging.getLogger('django.db.backends')    
In [21]: l.setLevel(logging.DEBUG)                      
In [22]: l.addHandler(logging.StreamHandler())      
In [23]: User.objects.all().order_by('-id')[:10]          
(0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=()
Out[23]: [<User: hamdi>]

mongoDB에서 이것을 시도했지만 SELECT가 지원되지 않습니다. mongoDB에서 어떻게합니까?
winux

@winux 이것은 장고에 따라 다르므로 Mongo / NoSQL 유형 데이터베이스와 특별히 작동하도록 장고를 설정해야 할 것 같습니다. 표준 Django ORM 설정과 관련하여 내 경험상 일반적인 설정은 아닙니다.
익명의 겁쟁이

38

실제로 LIMIT 10데이터베이스에 슬라이싱이 발생하기 때문에 데이터베이스에서 발행 될 것이라고 생각 합니다.

자세한 내용은 limiting-querysets 를 참조하십시오.


슬라이싱 후 필터링 할 수 없으므로 필터링이 필요한 쿼리 집합에는 작동하지 않습니다.
Mike 'Pomax'Kamermans

2
먼저 슬라이스보다 필터링하십시오. 링크 주셔서 감사합니다 Davor!
Vyachez

13

질문의 솔루션이 더 이상 Django 1.7에서 작동하지 않는 것으로 보이며 "조각을 만든 후에는 쿼리를 재정렬 할 수 없습니다"라는 오류가 발생합니다.

https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets 문서에 따르면 Python 슬라이스 구문의 "step"매개 변수를 강제로 실행하면 쿼리가 평가됩니다. 이 방법으로 작동합니다 :

Model.objects.all().order_by('-id')[:10:1]

여전히 한계가 SQL 또는 Python 슬라이스에서 실행되는지 궁금해 전체 결과 배열이 반환됩니다. 응용 프로그램 메모리에 큰 목록을 검색하는 것은 좋지 않습니다.


이 솔루션조차도 django> = 1.8 테스트에서는 작동하지 않습니다.
sonus21

3

예. 제한된 객체 하위 집합을 가져 오려면 아래 코드를 사용하십시오.

예:

obj=emp.objects.all()[0:10]

시작 0은 선택 사항이므로

obj=emp.objects.all()[:10]

위의 코드는 처음 10 개의 인스턴스를 반환합니다.


1

다른 유용한 답변에 대한 추가 및 관찰 [:10]로서 실제로 슬라이싱으로 수행 하면 목록의 처음 10 개 요소가 마지막 10 개가 아닌 반환됩니다 .

마지막 10 개를 얻으려면 [-10:]대신 수행해야 합니다 ( 여기 참조 ). 이것은 당신이 사용하지 않도록 도움이 될 것입니다 order_by('-id')-요소를 반전 할 수 있습니다.


1
나는 이것을 시도하고 "네거티브 인덱싱은 지원되지 않습니다."
bparker

@DarkCygnus에서 Product.objects.filter(~Q(price=0))[-5:]동일한 오류가 발생합니다. "음수 색인 작성이 지원되지 않습니다."
bersam

쿼리 셋의 django에서는 작동하지 않습니다. code.djangoproject.com/ticket/13089 쿼리 셋 을 목록으로 변환하면 작동합니다.
valem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.