2014-12-12 3 views
1

의 내가이 장고 모델이 있다고 가정 해 봅시다.장고 쿼리 자연 정렬

question_code으로 정렬하고 싶습니다.이 숫자는 영숫자입니다. 이것은 아주 고전적인 문제이며에 대한 이야기를하고있다 : 나는 (아래 복사 조금 변경) 제 2 링크의 코드를 시도

하고, 데이터를 정렬하는 데 최대 3 초가 걸립니다. 함수의 성능을 확인하기 위해 100k 임의의 영숫자 문자열 목록을 만드는 테스트를 작성합니다. 그 목록을 정렬하는 데 단지 0.76 초 밖에 걸리지 않습니다. 무슨 일 이니?

이것이 내가 생각하는 것입니다. 함수는 비교를 위해 각 질문의 question_code을 가져와야합니다. 따라서이 함수를 호출하여 15k 값을 정렬하면 mysql 15k 별도의 시간을 요청합니다. 그리고 이것이 왜 그렇게 오래 걸리는 이유입니다. 어떤 생각? 그리고 장고에 대한 자연적인 정렬에 대한 모든 해결책은 일반적으로? 고마워요!

답변

1

내가 아는 한 일반 장고 솔루션이 없습니다. 당신은 당신의 메모리 사용량을 줄이고 당신이 다음 ordered_question_codes을 슬라이스 당신이 필요로하는 모든 질문을 검색하는 다른 쿼리를 수행 할 수있는 결과 페이지를 원하는 가정에 id/question_code 조회 구조

from natsort import natsorted 
question_code_lookup = Question.objects.values('id','question_code') 
ordered_question_codes = natsorted(question_code_lookup, key=lambda i: i['question_code']) 

를 구축하여 DB 쿼리를 제한 할 수 있습니다 조회 구조가 여전히 너무 많은 메모리를 사용하거나 정렬하는 데 시간이 너무 오래 걸리는 경우 해당 슬라이스

#get the first 20 questions 
ordered_question_codes = ordered_question_codes[:20] 
question_ids = [q['id'] for q in ordered_question_codes] 
questions = Question.objects.filter(id__in=question_ids) 
#put them back into question code order 
id_to_pos = dict(zip((question_ids), range(len(question_ids)))) 
questions = sorted(questions, key = lambda x: id_to_pos[x.id]) 

에서의 위치에 따라 그 순서, 당신은 고급 뭔가 들고 오지해야합니다. 이것은 확실히 거대한 데이터 세트로 확장되지 않습니다.

+0

나는이 솔루션을 이전에 시도했지만 만족하지 않았습니다. 고마워요 anw :) – tnq177