QueryDict
erbt von Djangos MultiValueDict
, das von dict
erbt, was als Hash-Tabelle implementiert . Daher können Sie nicht garantieren, dass es bestellt bleibt.
Ich bin mir nicht sicher, ob dies für das relevant ist, was Sie brauchen, aber Eine Reihenfolge, die QueryDict beibehalten soll, ist die Reihenfolge von" Listen "(mehrere Werte für den gleichen Schlüssel), die an sie übergeben wurden . Mit diesem könnten Sie tun:
%Vor% QueryDict
Klasse basiert auf MultiValueDict
Klasse, die auf regulärem Python dict
basiert, was ein ungeordnete Sammlung, wie Sie wissen.
Laut dem Quellcode wird QueryDict
intern verwendet urlparse.parse_qsl()
Methode, die die Reihenfolge der Abfrageparameter beibehält, gibt eine Liste von Tupeln aus :
Sie können die Reihenfolge der Schlüssel verwenden, die von parse_qsl()
zum Sortieren angegeben werden:
Dann, Unterklasse QueryDict
und überschreiben lists()
Methode in urlencode()
verwendet:
Der Ansatz ist ein bisschen hässlich und könnte weitere Verbesserungen erfordern, aber hoffe zumindest, dass er dir eine Vorstellung davon gibt, was passiert und was du dagegen tun kannst.
Wenn ich fast 3 Jahre später auf diese Frage zurückkomme, habe ich gemerkt, dass wir ein QueryDict
trivial machen können, was die Sortierung durch Abhängigkeitsinjektion von collections.OrderedDict
als Mapping-Backend erhält:
Es funktioniert, weil super
entsprechend der MRO delegiert ist, also muss MyQueryDict
Proxy sein an die OrderedDict
für den Speicher, anstatt das reguläre Python dict
zu verwenden.
Tags und Links python django http query-string