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

다음 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)

더 좋은 방법이 있습니까?



답변

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


답변


답변

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

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).


답변

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


답변

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

# 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


답변

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

내 대답은 사전 내용을 명시 적으로 반복하지 않습니다. 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


답변

최신 정보:

myDict = dict(queryDict._iterlists())

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