Autant que je sache, il n'y a pas de solution Django générique à cela. Vous pouvez réduire votre utilisation de la mémoire et limiter vos requêtes db en créant une structure de recherche 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'])
En supposant que vous souhaitiez paginer les résultats, vous pouvez ensuite découper les codes_questions_commandés, effectuer une autre requête pour récupérer toutes les questions dont vous avez besoin, les classer en fonction de leur position dans cette tranche
#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])
Si la structure de recherche utilise encore trop de mémoire ou prend trop de temps à trier, vous devrez trouver quelque chose de plus avancé. Cela ne serait certainement pas adapté à un énorme ensemble de données