Programing

장고-쿼리 결과 제한

lottogame 2020. 5. 22. 08:08
반응형

장고-쿼리 결과 제한


모델의 마지막 10 인스턴스를 가져 와서이 코드를 갖고 싶습니다.

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

먼저 모든 인스턴스를 선택한 다음 마지막 인스턴스를 10 개만 가져가는 것이 사실입니까? 더 효과적인 방법이 있습니까?


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

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

아래에서 볼 수 있듯이 코드는 하나의 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>]

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

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


질문의 솔루션이 더 이상 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 슬라이스에서 실행되는지 궁금해 전체 결과 배열이 반환됩니다. 응용 프로그램 메모리에 큰 목록을 검색하는 것은 좋지 않습니다.


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

예:

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

시작 0은 선택 사항이므로

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

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


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

마지막 10 개를 얻으려면 [-10:]대신 수행해야 합니다 ( 여기 참조 ). 이렇게하면 요소를 반전시키기 위해 order_by('-id')와 함께 사용하지 -않아도됩니다.


이것은 실제로 일어나지 않습니다. Django는 필요한 결과 만 가져 오지 않습니다. Django는 전체 데이터베이스 테이블 (stup [id to do)]을로드하고 마지막 10 개의 레코드 만 반환합니다.

MySQL 서버에서 SHOW FULL PROCESSLIST를 실행하여이를 확인했으며 쿼리에 LIMIT 절이 없습니다.

Django는 높은 확장 성이 필요한 대규모 응용 프로그램을 개발하려는 경우 좋은 옵션이 아닙니다.

참고 URL : https://stackoverflow.com/questions/6574003/django-limiting-query-results

반응형