Django QueryDict를 Python Dict로 변경하는 방법은 무엇입니까?


111

다음 QueryDict가 있다고 가정 해 보겠습니다.

<QueryDict: {u'num': [0], u'var1': [u'value1', u'value2'], u'var2': [u'8']}>

다음과 같은 사전을 갖고 싶습니다.

{'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}

(유니 코드 기호 u가 남아 있든 가든 상관 없습니다 .)

그렇게 queryDict.dict()하면 django 사이트 에서 제안한대로 다음 과 같은 추가 값을 잃게됩니다 var1.

{'num': [0], 'var1':['value2'], 'var2':['8']}

나는 이것을 할 생각이었다 :

myDict = {}
for key in queryDict.iterkeys():
    myDict[key] = queryDict.getlist(key)

더 좋은 방법이 있습니까?

답변:


103

이것은 작동합니다. myDict = dict(queryDict.iterlists())


4
queryDict.iterlists ()는 각 키에서 목록 값을 만들고 있습니다. 아마도 목록을 살펴 보았 기 때문일까요?, querydict에 목록이 포함되어 있지 않다는 것을 알고 있다면 queryDict.iteritems ()입니다.
panchicore

3
django 1.6 : dict (data._iteritems ())
Bas Koopmans

5
Django 1.6에서 dict(queryDict.lists())작동하는 것 같습니다
Dan Passaro 2014

39
Python 3의 Django 1.8에서 필요한 것은 dict(queryDict).
fmalina

1
이것은 authomatic을 포함한 많은 라이브러리에서 작동하지 않습니다. 여기 내 질문과 내 답변을 참조하십시오 (python v2 및 v3에서 작동) : stackoverflow.com/questions/37026535/…
Olivier Pons

193

두 가지 방법으로 소스를 찾거나 시도하거나 볼 수 있습니다. 대답은 아니오입니다. def dict (self) : "" "현재 객체를 특이 값이있는 dict로 반환합니다." ""return dict ((key, self [key]) for key in self)
dalore

6
이것은 Google 에서이 페이지를 방문하는 일부 사람들의 문제를 해결하지만 키에 대해 여러 값을 유지하도록 명시 적으로 요청하는 OP의 질문에는 대답하지 않습니다.
폭동

1
이 답변에 대해 신에게 감사합니다. 나는 너무 단서가
없었다

Django 1.11 작업
jobima 19

16

이것이 내가 사용한 결과입니다.

def qdict_to_dict(qdict):
    """Convert a Django QueryDict to a Python dict.

    Single-value fields are put in directly, and for multi-value fields, a list
    of all values is stored at the field's key.

    """
    return {k: v[0] if len(v) == 1 else v for k, v in qdict.lists()}

내 사용법에서 이것은 예를 들어 양식 생성자에게 다시 보낼 수있는 목록을 얻는 것 같습니다.

편집 : 아마도 이것이 최선의 방법이 아닐 수도 있습니다. 예를 들어 QueryDict미친 이유 QueryDict.urlencode()가 무엇이든 파일에 쓰기 를 원한다면 갈 길입니다. 재건하려면 QueryDict간단히 QueryDict(urlencoded_data).


3
이 방법은 불확정 한 동작을 겪습니다. 주어진 키에 하나 이상의 값이있을 수있는 상황에서 때때로 문자열을 얻을 수 있으며 때로는 문자열 목록을 얻을 수 있습니다.
Asherah

8
from django.utils import six 
post_dict = dict(six.iterlists(request.POST))

6

값을 배열로 원하지 않는 경우 다음을 수행 할 수 있습니다.

# request = <QueryDict: {u'key': [u'123ABC']}>
dict(zip(request.GET.keys(), request.GET.values()))
{u'key': u"123ABC" }

# Only work for single item lists
# request = <QueryDict: {u'key': [u'123ABC',U 'CDEF']}>
dict(zip(request.GET.keys(), request.GET.values()))
{u'key': u"CDEF" } 

zip은 강력한 도구입니다 http://docs.python.org/2/library/functions.html#zip


2
장고> = 2.0 (내가 사용 단지 하나뿐만 아니라 이전 버전에서 힘의 작업), 당신이 할 수있는 : 난 그냥이 답변에 도달 누구에 대한 지적이 거의 6 세 알고 QueryDict.dict()(즉 request.POST.dict())과 값을 올바르게 반환합니다.
Luca Bezerra

루카 당신은 전설입니다. 이것은 나를 하루 종일 미치게 만들었다! 당신의 대답은 제가 일할 수있는 유일한 대답입니다.
scottapotamus

4

양식에서 임의의 값을 직렬화 된 값으로 저장하려는 비슷한 문제가 발생했습니다.

내 대답은 사전 내용을 명시 적으로 반복하지 않습니다. dict(querydict.iterlists())

원본으로 작동하는 사전과 유사한 값을 검색하기 위해 역함수 QueryDict.setlist()는 새 QueryDict값 을 채우는 데 사용 합니다. 이 경우 명시 적 반복은 피할 수 없다고 생각합니다.

내 도우미 기능은 다음과 같습니다.

from django.http import QueryDict

def querydict_dict(querydict):
    """
    Converts a Django QueryDict value to a regular dictionary, preserving multiple items.
    """
    return dict(querydict.iterlists())

def dict_querydict(dict_):
    """
    Converts a value created by querydict_dict back into a Django QueryDict value.
    """
    q = QueryDict("", mutable=True)
    for k, v in dict_.iteritems():
        q.setlist(k, v)
    q._mutable = False
    return q

3

최신 정보:

myDict = dict(queryDict._iterlists())

참고 :의 _iterlists 메서드에서 밑줄 을 긋습니다 queryDict. Django 버전 : 1.5.1


3

dict(request.POST) 배열로 래핑 된 값이있는 이상한 파이썬 사전을 반환합니다.

{'start': ['2017-01-14T21:00'], 'stop': ['2017-01-14T22:00'], 'email': ['sandeep@sakethtech.com']}

{x:request.POST.get(x) for x in request.POST.keys()}예상 출력 을 반환합니다.

{'start': '2017-01-14T21:00', 'stop': '2017-01-14T22:00', 'email': 'sandeep@sakethtech.com'}

Django> = 2.0 (이전 버전에서도 작동 할 수 있습니다. 제가 사용하는 버전입니다), 할 수 있습니다 QueryDict.dict()(예 request.POST.dict():). 그러면 값이 제대로 반환됩니다.
Luca Bezerra

2

그냥 추가

queryDict=dict(request.GET) 또는 queryDict=dict(QueryDict)

보기에서 데이터는 querDict에 python Dict로 저장됩니다.


1

이것이 내가 그 문제를 해결 한 방법입니다.

dict_ = {k: q.getlist(k) if len(q.getlist(k))>1 else v for k, v in q.items()}

1

나처럼, 당신은 아마도 Dict()파이썬의 메소드에 더 익숙 할 것입니다 . 그러나 QueryDict()사용하기 쉬운 개체이기도합니다. 예를 들어, 아마도 당신은 request.GET QueryDict().

다음과 같이 할 수 있습니다 request.GET.__getitem__(<key>)..

QueryDict()문서 : https://docs.djangoproject.com/en/2.0/ref/request-response/#django.http.QueryDict


1
이중 밑줄 방법을 사용하지 마십시오. 더 request.GET.get(<key>)request.GET.getlist(<key>)
비단뱀적인

1

Django 2.2몇 깨끗한 해결책이 있습니다 :

  1. QueryDict.dict()가장 간단하지만 QueryDict목록을 값으로 사용하여 깨 집니다. 예 :
from django.http.request import QueryDict, MultiValueDict

query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})

for key, value in query_dict.dict().items():  # ---> query_dict.dict()
    print(key, value)

출력됩니다

a two  # <--- missed 'one'
b three
  1. dict(QueryDict) 올바른 목록 사전을 만들기 때문에 더 좋습니다.
from django.http.request import QueryDict, MultiValueDict

query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict({'a': ['one', 'two']}))
query_dict.update({'b': 'three'})

for key, value in dict(query_dict).items():  # ---> dict(query_dict)
    print(key, value)

출력됩니다

a ['one', 'two']
b ['three']

맞습니다.


0

나는 밖으로 시도 모두 dict(request.POST)request.POST.dict()당신이있는 경우에 실현 list예를 들어 값 'var1':['value1', 'value2']귀하의 중첩을 request.POST은 나중에 ( request.POST.dict()) 만 (구가하면서 나를 중첩 된 목록의 마지막 항목에 액세스 할 준 dict(request.POST)) 중첩 된 목록에있는 모든 항목에 액세스 할 날을 허용했다.

누군가에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.