Kann ich Django QueryDict beibehalten, um die Reihenfolge beizubehalten?

8

Ist es möglich, Djangos QueryDict die Reihenfolge aus der ursprünglichen Abfragezeichenfolge beizubehalten?

%Vor%     
wim 14.05.2014, 18:22
quelle

3 Antworten

2

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%     
pcoronel 14.05.2014 19:04
quelle
1

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 :

%Vor%

Sie können die Reihenfolge der Schlüssel verwenden, die von parse_qsl() zum Sortieren angegeben werden:

%Vor%

Dann, Unterklasse QueryDict und überschreiben lists() Methode in urlencode() verwendet:

%Vor%

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.

    
alecxe 14.05.2014 19:20
quelle
0

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:

%Vor%

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.

%Vor%     
wim 23.01.2017 02:46
quelle

Tags und Links