2016-10-04 4 views
3

데이터베이스 테이블에 많은 행이있는 경우 장고의 관리자 목록보기가 다소 느려지는 것으로 알려져 있습니다. Django 페이징 기가 기본적으로 (느린) PostgreSQL COUNT 쿼리를 사용하기 때문입니다.PostgreSQL 카운트 견적으로 장고의 관리자 페이지 속도를 높이려면 어떻게해야합니까?

평가는 우리에게 좋은 것 그것은 훨씬 빠릅니다로서 예 : SELECT reltuples FROM pg_class WHERE relname = "my_table_name"

이이 문제를 해결하는 데 사용할 수 조각이지만, 실제로 그것을 사용하는 방법을 나에게 불분명 : https://djangosnippets.org/snippets/2593/

또한 스 니펫은 필터링 된 결과에서 작동하지 않습니다. 위에 표시된 예상 개수가 여기에서 작동하지 않기 때문입니다. 장고 관리자 페이지에서 필터링 된 목록보기를 빠르게하는 또 다른 방법이 있습니까?

답변

1

당신은 페이지 매기기에 사용되는 ModelAdmin.paginator

페이지 배열 클래스를 오버라이드 (override)를 사용합니다. 기본적으로 django.core.paginator.Paginator가 사용됩니다. 맞춤 페이지 매기기 클래스 에 django.core.paginator.Paginator와 동일한 생성자 인터페이스가 없으면 ModelAdmin.get_paginator()에 구현을 제공해야합니다.

class MyModelAdmin(admin.ModelAdmin): 
    paginator = CachingPaginator 

보너스 기능 : 내가 함께 및 필터없이 작동 하나를 만들기 위해 그 조각에 개선 : https://gist.github.com/e4c5/6852723이 rel_tuples 가능하지만 필터가 카운트가 캐시에 저장되어 사용됩니다에서 카운트를 얻는다 .

업데이트 1 :
당신의 대답에 reffered 원래 조각의 문제가 1.6 릴리스 노트에 발표 된이 변화로 인해 : https://docs.djangoproject.com/en/1.10/releases/1.6/#get-query-set-and-similar-methods-renamed-to-get-queryset

그것은 사소한 수정합니다.

업데이트 2
원래 조각 내 개선이 이루어지고있다 카운트 이름이 변경되고, 또한이 원하는 선택할 수있는 옵션이있는 cached_property

+0

; 하지만 어느 스크립트도 Django 1.10에서 작동하지 않는 것 같습니다. 당신의 결과는'CachingPaginator 객체에 속성이 없습니다 '_count''라는 오류를 반환합니다 - 원본 스크립트는''LargeTableChangeList'객체에 ''query_set ''속성이 없습니다 - 아이디어를 반환합니까? –

+0

업데이트 해 주셔서 감사합니다. 불행히도 여전히 작동하지 않습니다. 'count '의 이름을'count'로 바꿨습니다. 이제 당신과 다른 스 니펫에서'self.count가 None :'인 줄에 대해 Python 객체를 호출하는 동안 '최대 재귀 깊이를 초과했습니다.'오류가 발생합니다. –

+0

나는이 스 니펫을 사용하는 방법에 관한 질문의 원래 범위와는 거리가 멀다 고 생각합니다. 여기서는 적절하게 다루지 않았다고 생각합니다. 이 스 니펫 (질문 자체에 코드 포함)과 함께 새로운 질문을 올리십시오. 오류 추적 – e4c5

0

로 장식되는 _count의 PROPERT에 의해 사용되지 않는 것을 일부 장고 1.8 이후의 행동 : https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.show_full_result_count

예 : 나는 그것을 사용하는 방법을

class MyModelAdmin(admin.ModelAdmin): 
    show_full_result_count = False 
+0

솔루션에 대한 링크는 환영합니다. 그러나 링크가없는 상황에서 유용한 답변을 제공하십시오. (// meta.stackexchange.com/a/8259) 그리고 왜 그곳에 있는지, 그리고 목표 페이지를 사용할 수 없을 때 당신이 링크하고있는 페이지의 가장 중요한 부분을 인용하십시오. [링크 이상의 답변은 삭제 될 수 있습니다.] (// stackoverflow.com/help/deleted-answers) –