답변:
장고 쿼리 셋은 게으르다. 즉, 결과를 구체적으로 요청할 때만 쿼리가 데이터베이스에 도달합니다.
따라서 쿼리 결과를 인쇄하거나 실제로 사용할 때까지 데이터베이스 액세스없이 추가로 필터링 할 수 있습니다.
아래에서 볼 수 있듯이 코드는 하나의 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 슬라이스에서 실행되는지 궁금해 전체 결과 배열이 반환됩니다. 응용 프로그램 메모리에 큰 목록을 검색하는 것은 좋지 않습니다.
다른 유용한 답변에 대한 추가 및 관찰 [:10]
로서 실제로 슬라이싱으로 수행 하면 목록의 처음 10 개 요소가 마지막 10 개가 아닌 반환됩니다 .
마지막 10 개를 얻으려면 [-10:]
대신 수행해야 합니다 ( 여기 참조 ). 이것은 당신이 사용하지 않도록 도움이 될 것입니다 order_by('-id')
와 -
요소를 반전 할 수 있습니다.
Product.objects.filter(~Q(price=0))[-5:]
동일한 오류가 발생합니다. "음수 색인 작성이 지원되지 않습니다."