私の知る限り、これに対する一般的なDjangoソリューションはありません。 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'])
結果をページングしたい場合は、ordered_question_codesをスライスし、別のクエリを実行して、必要なすべての質問を取得し、そのスライス内の位置に従って並べ替えます。
#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])
それでもルックアップ構造が大量のメモリを使用する場合、またはソートに時間がかかりすぎる場合は、より高度なものを考え出す必要があります。これは確かに巨大なデータセットにうまく拡張できません