Załóżmy, że mam następujący QueryDict:
<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>
Chciałbym mieć z tego słownik, np .:
{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
(Nie obchodzi mnie, czy symbol Unicode u
pozostaje, czy znika).
Jeśli to zrobię queryDict.dict()
, jak sugeruje strona django , stracę dodatkowe wartości należące do var1
np .:
{'num': [0], 'var1':['value2'], 'var2':['8']}
Myślałem o zrobieniu tego:
myDict = {}
for key in queryDict.iterkeys():
myDict[key] = queryDict.getlist(key)
Czy jest lepszy sposób?
dict(queryDict.lists())
Wydaje się , że w Django 1.6 działadict(queryDict)
.Nowość w Django> = 1.4.
QueryDict.dict()
https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict
źródło
Oto, co ostatecznie użyłem:
Z mojego doświadczenia wynika, że otrzymujesz listę, którą możesz odesłać np. Do konstruktora formularzy.
EDYCJA: może to nie jest najlepsza metoda. Wydaje się, że jeśli chcesz np. Pisać
QueryDict
do pliku z jakiegoś szalonego powodu,QueryDict.urlencode()
jest to najlepszy sposób. Aby zrekonstruować to,QueryDict
co po prostu robiszQueryDict(urlencoded_data)
.źródło
źródło
Jeśli nie chcesz, aby wartości były tablicami, możesz wykonać następujące czynności:
zip to potężne narzędzie. Przeczytaj więcej na ten temat tutaj http://docs.python.org/2/library/functions.html#zip
źródło
QueryDict.dict()
(tj.request.POST.dict()
) I to zwróci wartości poprawnie.Napotkałem podobny problem, chcąc zapisać dowolne wartości z formularza jako wartości serializowane.
Moja odpowiedź unika jawnego iterowania zawartości słownika:
dict(querydict.iterlists())
Aby pobrać wartość podobną do słownika, która działa jak oryginał, funkcja odwrotna używa
QueryDict.setlist()
do wypełnienia nowejQueryDict
wartości. W tym przypadku nie sądzę, aby można było uniknąć wyraźnej iteracji.Moje funkcje pomocnicze wyglądają tak:
źródło
Aktualizacja:
Uwaga: podkreślenie
_
w iterlists metodaqueryDict
. Wersja Django: 1.5.1źródło
dict(request.POST)
zwraca dziwny słownik Pythona z wartościami opakowanymi w tablicę.gdzie jak
{x:request.POST.get(x) for x in request.POST.keys()}
zwraca oczekiwany wynik.źródło
QueryDict.dict()
(tj.request.POST.dict()
) I zwróci wartości poprawnie.po prostu dodaj
queryDict=dict(request.GET)
lubqueryDict=dict(QueryDict)
W Twoim widoku dane zostaną zapisane w querDict jako python Dict.
źródło
Oto jak rozwiązałem ten problem:
źródło
Podobnie jak ja, prawdopodobnie lepiej znasz
Dict()
metody w Pythonie. JednakQueryDict()
jest to również obiekt łatwy w użyciu. Na przykład, być może chcesz uzyskać wartość z plikurequest.GET QueryDict()
.Można to zrobić w taki sposób:
request.GET.__getitem__(<key>)
.QueryDict()
dokumentacja: https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDictźródło
request.GET.get(<key>)
orrequest.GET.getlist(<key>)
Ze
Django 2.2
istnieje kilka czystych rozwiązań:QueryDict.dict()
jest najprostszy, ale zepsujeQueryDict
listy jako wartości, np .:wyjdzie
dict(QueryDict)
jest lepszy, ponieważ poprawi słownik list:wyjdzie
który jest poprawny.
źródło
Wypróbowałem oba
dict(request.POST)
irequest.POST.dict()
zdałem sobie sprawę, że jeśli maszlist
wartości na przykład'var1':['value1', 'value2']
zagnieżdżone w swojejrequest.POST
, późniejsza (request.POST.dict()
) dała mi dostęp tylko do ostatniej pozycji na zagnieżdżonej liście, podczas gdy pierwsza (dict(request.POST)
) pozwoliła mi uzyskać dostęp do wszystkich pozycji na liście zagnieżdżonej.Mam nadzieję, że to komuś pomoże.
źródło