2014-06-09 3 views
0

내 탐색 막대에 search이라는보기로 쿼리를 보내는 검색 상자가 있습니다. 정확히 같은 DB 조회를 요구하는, 내가 그 일에 대한 몇 가지 정보를 표시하려면,django 리디렉션 후 반복되는 데이터베이스 검색을 피하십시오

def search(request): 
    try: 
     search_string = request.GET['q'] 
    except MultiValueDictKeyError: 
     raise Http404 

    try: 
     Thing.objects.get(name=search_string) 
     return HttpResponseRedirect('/thing/{}'.format(search_string)) 
    except Thing.DoesNotExist: 
     # do something else... 

을 내 thing보기에서 : search에서 나는 않을 경우 DB가 검색 일이 존재하는지 확인하고 /thing/name로 리디렉션 확인 :

def thing(request, name): 
    thing= Thing.objects.get(name=name) 
    # do something with thing... 

제 질문은 어떻게 동일한 DB 조회를 수행하지 않고도 리디렉션을 수행 할 수 있습니까? 어떻게 든 조회를 캐시 할 수 있습니까?

답변

1

이렇게하면 성능이 크게 향상 될 수 있습니다. 그 이유는 두 번째 페이지의 하드 드라이브에서 결과를 읽는 것입니다. 이것이 데이터베이스에서 다시 가져 오기 또는 캐시에서 읽기의 형식을 취하는 경우에도 읽기가 여전히 필요합니다. 해결 방법은 첫 번째보기에서 전체 db 행을 가져 오지 않고 검색어의 존재 여부를 확인하는 것입니다. 당신은 당신의 원본 코드가 수행되지 않은 카운트()

def search(request): 
    try: 
     search_string = request.GET['q'] 
    except MultiValueDictKeyError: 
     raise Http404 

    if Thing.objects.filter(name=search_string).count() == 1: 
     return HttpResponseRedirect('/thing/{}'.format(search_string)) 
    else: 
     # Thing doesn't exist, or there are multiple entries for Thing 

이것은 또한 복수의 결과를 돌려 어떤 검색어가 처리되는 것을 의미한다을 수행하여이 작업을 수행 할 수 있습니다.

+0

감사 합니다만, 나는 이런 종류의 일이 얼마나 오래 걸릴지에 대한 어떤 직관도 아직 가지고 있지 않습니다. 거대한 DB를 조회하는 경우에도 단순히 디스크에서 값을 읽는 것과 비슷한 시간이 걸릴 것입니까? – Ferguzz

+0

@Ferguzz 나는 두 가지를 테스트하거나 비교하지 않았으므로 잘 모른다. 내가 아는 것은 검색보기에서 카운트를 잡는 것이 get()보다 빠르다는 것입니다. 또 다른 일은'name' 필드가 데이터베이스 (https://docs.djangoproject.com/en/dev/ref/models/fields/#db-index)에 의해 색인되어 있는지 확인하는 것입니다. – hellsgate

관련 문제