Theo như tôi biết thì không có giải pháp Django chung cho vấn đề này. Bạn có thể giảm mức sử dụng bộ nhớ và giới hạn các truy vấn db của mình bằng cách xây dựng cấu trúc tra cứu 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'])
Giả sử bạn muốn phân trang các kết quả, sau đó, bạn có thể chia nhỏ các mã lệnh_question_codes, thực hiện một truy vấn khác để truy xuất tất cả các câu hỏi bạn cần, sắp xếp chúng theo vị trí của chúng trong phần đó
#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])
Nếu cấu trúc tra cứu vẫn sử dụng quá nhiều bộ nhớ hoặc mất quá nhiều thời gian để sắp xếp, thì bạn sẽ phải tìm ra thứ gì đó nâng cao hơn. Điều này chắc chắn sẽ không mở rộng thành một tập dữ liệu khổng lồ