2017-03-15 2 views
2

Mein Python Unicode-Wörterbuch sieht wie folgt aus zuzugreifen:Able nur letztes Element der Liste in Python Unicode-Wörterbuch

`<QueryDict: {u'csrfmiddlewaretoken':[u'oacUfIz5q2tPtmSoqCQi7tBDn2ejpt4x9ZiFeLKeIOyB2CHvAoJqbe1cHNZJSObP'], u'Date and Events[]': [u'2000-09-09', u'bday', u'second']}>` 

Wenn ich versuche, das Element mit dem Schlüssel ‚Datum und Event []‘ zuzugreifen, erhalte ich nur das letzte Element der Liste. Irgendeine Idee, warum dies geschieht?

Antwort

1

__getitem __() in Dict gibt das Objekt so zurück, wie es ist. Sei es ein Int, Float, String oder eine Liste. Bei QueryDict ist das nicht der Fall. Entweder müssen Sie QueryDict.getlist (Schlüssel) verwenden oder es in ein Dict konvertieren, um Ihre Arbeit zu erledigen. Nehmen wir an, dass 'qd' das QueryDict ist, aus dem die Elemente extrahiert werden sollen.

date = QueryDict.getlist('Date') 
    events = QueryDict.getlist('Events[]') 

Wenn Sie die QueryDict dict konvertieren möchten, dann könnten Sie so etwas wie dies tun, um Ihre Aufgabe zu erfüllen.

myDict = dict(qd.iterlists()) 
    date = myDict['Date'] 
    events = myDict['Events[]'] 
2

Verwendung .getlist(key):

>>> qd = QueryDict('a=1&a=2')   # a simple QueryDict 
>>> qd 
<QueryDict: {'a': ['1', '2']}> 
>>> qd['a']        # example of the problem (last item only) 
'2' 
>>> qd.get('a')       # problem not solved by .get() 
'2' 
>>> qd.getlist('a')      # getlist() solves it! 
['1', '2'] 

Details:

Ihr Wörterbuch ist vom Typ django.http.QueryDict die „ist ein Wörterbuch artige Klasse individualisiert mit mehreren Werten für den gleichen Schlüssel zu beschäftigen.“ Leider gibt QueryDict.__getitem__() "nur den letzten Wert zurück". Das bedeutet, dass Aufrufe an someQueryDict[key] keine Liste zurückgeben, auch wenn mehrere Werte mit dem Schlüssel verknüpft sind.

Die Lösung ist QueryDict.getlist(key, default=None) zu verwenden:

die Daten mit der angeforderten Schlüssel Kosten, als Python-Liste. Gibt eine leere Liste zurück, wenn der Schlüssel nicht existiert und kein Standardwert angegeben wurde. Es ist garantiert, dass eine Liste einer bestimmten Art zurückgegeben wird, es sei denn, der angegebene Standardwert ist keine Liste.

+0

Vielen Dank, das funktioniert :) –