Stellen wir uns vor, ich hätte das folgende QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Ich hätte gerne ein Wörterbuch daraus, zB:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(Es ist mir egal, ob das Unicode-Symbol u
bleibt oder geht.)
Wenn ich dies tue queryDict.dict()
, wie von der Django-Site vorgeschlagen , verliere ich die zusätzlichen Werte, die dazu gehören var1
, z.
{'num': [0], 'var1':['value2'], 'var2':['8']}
Ich dachte darüber nach:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Gibt es einen besseren Weg?
dict(queryDict.lists())
scheint zu funktionierendict(queryDict)
.Neu in Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/de/stable/ref/request-response/#django.http.QueryDict.dict
quelle
Folgendes habe ich letztendlich verwendet:
Aus meiner Verwendung scheint dies eine Liste zu erhalten, die Sie beispielsweise an einen Formularkonstruktor zurücksenden können.
EDIT: Vielleicht ist dies nicht die beste Methode. Es scheint, wenn Sie zB
QueryDict
aus irgendeinem verrückten Grund in eine Datei schreiben möchten ,QueryDict.urlencode()
ist dies der richtige Weg. Um das zu rekonstruieren,QueryDict
machst du es einfachQueryDict(urlencoded_data)
.quelle
quelle
Wenn Sie die Werte nicht als Arrays verwenden möchten, können Sie Folgendes tun:
zip ist ein leistungsstarkes Tool. Weitere Informationen finden Sie hier http://docs.python.org/2/library/functions.html#zip
quelle
QueryDict.dict()
(dhrequest.POST.dict()
) und es gibt die Werte korrekt zurück.Ich stieß auf ein ähnliches Problem und wollte beliebige Werte aus einem Formular als serialisierte Werte speichern.
Meine Antwort vermeidet es, den Wörterbuchinhalt explizit zu wiederholen:
dict(querydict.iterlists())
Um einen wörterbuchähnlichen Wert abzurufen, der als Original fungiert, wird mit einer Umkehrfunktion
QueryDict.setlist()
ein neuerQueryDict
Wert aufgefüllt. In diesem Fall halte ich die explizite Iteration nicht für vermeidbar.Meine Hilfsfunktionen sehen folgendermaßen aus:
quelle
Aktualisieren:
Bitte beachten Sie: Unterstreichen Sie
_
in der Iterlists-Methode vonqueryDict
. Django-Version: 1.5.1quelle
dict(request.POST)
Gibt ein seltsames Python-Wörterbuch mit Array-umschlossenen Werten zurück.Dabei wird die
{x:request.POST.get(x) for x in request.POST.keys()}
erwartete Ausgabe zurückgegeben.quelle
QueryDict.dict()
(dhrequest.POST.dict()
) und die Werte werden ordnungsgemäß zurückgegeben.einfach hinzufügen
queryDict=dict(request.GET)
oderqueryDict=dict(QueryDict)
Aus Ihrer Sicht werden Daten in querDict als Python Dict gespeichert.
quelle
So habe ich dieses Problem gelöst:
quelle
Wie ich sind Sie wahrscheinlich besser mit
Dict()
Methoden in Python vertraut . DasQueryDict()
Objekt ist jedoch auch einfach zu bedienen. Zum Beispiel wollten Sie vielleicht den Wert von der erhaltenrequest.GET QueryDict()
.Sie können dies folgendermaßen tun :
request.GET.__getitem__(<key>)
.QueryDict()
Dokumentation: https://docs.djangoproject.com/de/2.0/ref/request-response/#django.http.QueryDictquelle
request.GET.get(<key>)
oderrequest.GET.getlist(<key>)
Mit
Django 2.2
gibt es nur wenige saubere Lösungen:QueryDict.dict()
ist am einfachsten, aber es wirdQueryDict
mit Listen als Werte gebrochen , zB:wird ausgegeben
dict(QueryDict)
ist besser, weil es das richtige Wörterbuch der Listen macht:wird ausgegeben
welches ist richtig.
quelle
Ich habe versucht , aus beide
dict(request.POST)
undrequest.POST.dict()
und erkennen , dass , wenn Sielist
Werte zum Beispiel'var1':['value1', 'value2']
in Ihrem verschachteltrequest.POST
, die später (request.POST.dict()
) nur gab ich in einer verschachtelten Liste zum letzten Elemente zugreifen , während der ehemaligen (dict(request.POST)
) mich erlaubt , alle Elemente in einer verschachtelten Liste zuzugreifen.Ich hoffe das hilft jemandem.
quelle