Voor zover ik weet is hier geen generieke Django-oplossing voor. U kunt uw geheugengebruik verminderen en uw db-query's beperken door een id/question_code lookup-structuur te bouwen
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'])
Ervan uitgaande dat u de resultaten wilt pagina's, kunt u geordende_vraagcodes opsplitsen, een andere zoekopdracht uitvoeren om alle vragen op te halen die u nodig hebt en ze rangschikken volgens hun positie in dat segment
#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])
Als de opzoekstructuur nog steeds te veel geheugen gebruikt, of te lang duurt om te sorteren, dan moet je iets geavanceerder bedenken. Dit zou zeker niet goed schalen naar een enorme dataset