장고-쿼리 결과 제한
모델의 마지막 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
'Programing' 카테고리의 다른 글
불완전한 유형의 std :: unique_ptr은 컴파일되지 않습니다 (0) | 2020.05.22 |
---|---|
Android Studio 2.0에서 즉시 실행 (끄는 방법) (0) | 2020.05.22 |
Injectable 클래스가 인스턴스화 될 때 ngOnInit가 호출되지 않음 (0) | 2020.05.22 |
InvokeRequired 코드 패턴 자동화 (0) | 2020.05.22 |
java.lang.ClassNotFoundException 가져 오기 : org.apache.commons.logging.LogFactory 예외 (0) | 2020.05.22 |