पायजोन डिक्ट को एक django QueryDict कैसे बदलें?


111

आइए दिखाते हैं कि मेरे पास निम्नलिखित प्रश्न हैं:

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

मैं इसमें से एक शब्दकोश निकालना चाहता हूँ, जैसे:

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

(अगर यूनिकोड प्रतीक uरहता है या जाता है तो मुझे कोई फर्क नहीं पड़ता ।)

यदि मैं django साइटqueryDict.dict() द्वारा सुझाए गए अनुसार करता हूं, तो मैं संबंधित अतिरिक्त मान खो देता हूं , जैसे: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.iteritems () यदि आपको पता है कि क्वेरीड में सूची नहीं है।
पंचमीत

3
Django 1.6 में: तानाशाह (data._iteritems ())
Bas Koopmans

5
Django 1.6 में, dict(queryDict.lists())काम करने लगता है
Dan Passaro

39
Django 1.8 में पायथन 3 पर जो मुझे चाहिए था dict(queryDict)
फालिना

1
यह कई लाइब्रेरी के लिए काम नहीं करता है जिसमें ऑक्टोमेटिक शामिल हैं। मेरा प्रश्न और मेरा स्वयं का उत्तर यहाँ देखें (p2thon के v2 और v3 के साथ काम करता है): stackoverflow.com/questions/37026535/…
ओलिवियर पोंस

193

यह पता लगाने के दो तरीके, इसे आज़माएं, या स्रोत देखें। जवाब नहीं है: def dict (स्वयं): "" (स्वयं में कुंजी के लिए (कुंजी, आत्म [कुंजी])) "विलक्षण मूल्यों के साथ एक dict के रूप में रिटर्न वर्तमान वस्तु।" "" वापसी dict
dalore

6
हालांकि यह उन लोगों में से कुछ के लिए समस्या को हल करता है, जो Google से इस पृष्ठ पर आते हैं, यह ओपी के प्रश्न का उत्तर नहीं देता है जो कुंजी के लिए कई मानों को बनाए रखने के लिए स्पष्ट रूप से पूछता है।
दंगे हुए

1
इस उत्तर के लिए भगवान का शुक्र है। मैं इतनी
चुलबुली थी

Django 1.11
jobima

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
यह विधि अनिश्चित व्यवहार से ग्रस्त है; ऐसी स्थिति में जहां किसी दिए गए कुंजी में एक या अधिक मान हो सकते हैं, आप कभी स्ट्रिंग प्राप्त कर सकते हैं, और कभी-कभी स्ट्रिंग की सूची प्राप्त कर सकते हैं।
अशरह


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
मुझे पता है कि यह लगभग 6 साल पुराना है, जो भी इस उत्तर तक पहुंचता है, उसके लिए इशारा करते हुए: Django> = 2.0 (पुराने संस्करणों में भी काम कर सकता है, यह सिर्फ एक है जो मैं उपयोग कर रहा हूं), आप कर सकते हैं QueryDict.dict()(यानी request.POST.dict()) और यह मूल्यों को ठीक से वापस करेगा।
लुका बीज़र्रा

लुका आप एक किंवदंती हैं। यह मुझे पूरे दिन पागल बना रहा है! तुम्हारा ही जवाब है मुझे काम मिल सकता है।
स्कूटापोटामस

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()) और यह ठीक से मान लौटाएगा।
लुका बीज़र्रा

2

बस जोड़ दो

queryDict=dict(request.GET) या queryDict=dict(QueryDict)

आपके विचार और डेटा को अजगर डिक्ट के रूप में querDict में सहेजा जाएगा।


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
डबल-अंडरस्कोर विधियों का उपयोग करने से बचें। अधिक pythonic तरीके से उपयोग किया जाएगा request.GET.get(<key>)याrequest.GET.getlist(<key>)
Bobort

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)) एक नेस्टेड सूची में सभी आइटम का उपयोग करने के लिए मुझे अनुमति दी।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.