Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Natürliche Sortierung für Django-Abfragen

Soweit mir bekannt ist, gibt es dafür keine generische Django-Lösung. Sie können Ihren Speicherverbrauch reduzieren und Ihre DB-Abfragen begrenzen, indem Sie eine ID/Frage_Code-Suchstruktur aufbauen

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

Angenommen, Sie möchten die Ergebnisse seitenweise anzeigen, dann können Sie die „ordered_question_codes“ aufteilen und eine weitere Abfrage durchführen, um alle benötigten Fragen abzurufen. Ordnen Sie sie entsprechend ihrer Position in diesem 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])

Wenn die Nachschlagestruktur immer noch zu viel Speicher benötigt oder das Sortieren zu lange dauert, müssen Sie sich etwas Fortgeschritteneres einfallen lassen. Dies würde sicherlich nicht gut auf einen riesigen Datensatz skalieren