2010-03-10 4 views
0

저는 현재 일부 디자인을위한 간단한 검색 방법을 만들고 있습니다. 이 쿼리는 작성자 이름과 디자인 텍스트를 모두 검색합니다. 문제 : 데이터베이스에 300,000 개의 디자인이 있고 결과에 페이지 매기기를 수행하려고하면 어떻게됩니까? page 변수를 전달하면 사용자가 다른 페이지로 전환 할 때마다 쿼리가 다시 실행됩니다.어떻게 장고에서 동적 검색의 결과에 페이지 매김을합니까?

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 가능한 한 많은 검색을 적절하게 캐싱하고 있습니까? 세션 데이터에 일정량을 저장하고 있습니까?

""" 
Searches by screenname or design text 
""" 
def search_designs(request): 

    designs = None 
    words = None 

    if request.method == 'POST': 
     q  = request.POST['search'] 
     words = q.split() 

     # Get all approved designs 
     designs = Design.objects.filter(status=2) 

     for w in words: 
      designs = designs.filter(name__icontains=w) | designs.filter(author__profile__screenname__icontains=w) 

    vars = RequestContext(request, 
    { 
     'results' : designs, 
     'words' : words, 
    }) 
    return render_to_response("search_test.html", vars) 
+0

다음을 살펴보십시오 : https://djangosnippets.org/snippets/1592/ – Mortezaipo

답변

2

나는 django-pagination을 확인합니다. 템플릿 레벨에서 페이지 매김을 처리합니다. 통합하기가 정말 쉽습니다.

+0

페이지 설정에 대해 걱정하지 않으셔도됩니다. 동적으로 검색된 결과로 '상태'. 그렇지 않으면, 당신이 페이지에 갈 때마다, 당신은 본질적으로 "Django, 같은 결과에 대해 다시 전체 데이터베이스를 검색하고 나에게 페이지 (x)를 준다"라고 말합니다. – Sebastian

+0

django-pagination이 제대로 수행되면 필요한 객체 만 검색합니다 현재 페이지. 아마도 당신이 작성한 것이 제대로 수행되지 않았을 것입니까? –

+0

자신 만의 페이지 매김을 만들 필요가 없습니다. 아주 좋습니다. 'QuerySets'는 게으르기 때문에 평가를 강제하는 뷰에서 아무 일도하지 않는 한 필요한 항목 만 데이터베이스에서 가져옵니다. – Zach

1

그래서 모든 결과를 저장하려고하므로 사용자가 페이지를 이동할 때 데이터베이스에 다시 액세스하지 못합니다. 그렇습니까? 동적 검색이므로이 페이지를 캐시하는 유일한 방법은 아직 방문하지 않은 정적 페이지이지만 캐시되지 않습니다. 따라서 사용자가 이전 페이지로 돌아가는 유일한 이점이 있습니다. 나는이 관행에서 많은 이득을 얻을 것이라고 생각하지 않습니다.

사용자가 페이지를로드 할 때마다 하나의 쿼리를 실행해도 문제가 없습니다.

또한 템플릿에서 쿼리 세트를 반복하는 경우 각 반복이 데이터베이스에 도달합니다. 템플릿에 설정된 쿼리를 전달하기 바로 전에 multiple database 히트를 피하기 위해 my_query_set = list (my_query_set)를 사용하십시오.

+0

루이즈 (Luiz)의 설명서에는 "QuerySet은 반복 가능하며 처음 반복 할 때 데이터베이스 쿼리를 실행합니다." 그래도 list()에 대해 알려 주셔서 감사합니다. 그것은 알아두면 좋아. – Sebastian

관련 문제