Mysql
 sql >> Database >  >> RDS >> Mysql

Django Query Ordinamento naturale

Per quanto ne so, non esiste una soluzione Django generica a questo. Puoi ridurre l'utilizzo della memoria e limitare le query db costruendo una struttura di ricerca 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'])

Supponendo che tu voglia impaginare i risultati, puoi quindi suddividere order_question_codes, eseguire un'altra query per recuperare tutte le domande di cui hai bisogno ordinandole in base alla loro posizione in quella sezione

#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])

Se la struttura di ricerca utilizza ancora troppa memoria o impiega troppo tempo per l'ordinamento, dovrai trovare qualcosa di più avanzato. Questo certamente non si adatterebbe bene a un enorme set di dati