কীভাবে একটি জাঙ্গো কোয়েরিডিক্টকে পাইথন ডিক্টে পরিবর্তন করবেন?


111

আসুন ভান করি আমি নিম্নলিখিত কোয়েরি ডিক্ট আছে:

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

আমি এর থেকে একটি অভিধান চাই, উদাহরণস্বরূপ:

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

(ইউনিকোড প্রতীকটি স্থিত uথাকে বা যায় সেদিকে আমার কোন খেয়াল নেই )

জ্যাঙ্গো সাইটের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
ক্যোয়ারিডিক্ট.িটরিলিস্টগুলি () প্রতিটি কী থেকে একটি তালিকা মান তৈরি করছে, সম্ভবত আপনি তালিকা দেখছেন বলে ?, ক্যুয়ারিডিক্ট ডাইটারাইটস () আপনি যদি জানেন যে ক্যোরিডিক্টের তালিকাটি নেই।
পাঁচচিকর

3
জাজানো ১.6-তে: ডিক্ট (ডাটা._পিটারাইটেমস ())
বাস কোপম্যানস

5
জাজানো ১.6 এ, dict(queryDict.lists())কাজ করছে বলে মনে হচ্ছে
ড্যান পাসারো

39
পাইথন 3 তে জ্যাঙ্গো 1.8 এ আমার যা যা প্রয়োজন তা ছিল dict(queryDict)
ফলমিনা

1
এটি লেখক সহ অনেকগুলি লাইব্রেরির জন্য কাজ করে না। আমার প্রশ্ন এবং আমার নিজের উত্তর এখানে দেখুন (পাইথনের v2 এবং v3 নিয়ে কাজ করে): স্ট্যাকওভারফ্লো
অলিভিয়ার পন্স

193

জ্যাঙ্গোতে নতুন> = 1.4।

QueryDict.dict()

https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.QueryDict.dict


খুঁজে বের করার, এটি চেষ্টা করার বা উত্সটি দেখার দুটি উপায়। উত্তর নেই: Def অভি (স্ব): "" (স্ব কী জন্য (কী, স্ব [Key])) "একবচন মান সঙ্গে একটি অভি যেমন রিটার্নস বর্তমান বস্তুর।" "" রিটার্ন অভি
dalore

6
এটি গুগল থেকে এই পৃষ্ঠায় আগত কিছু লোকের জন্য সমস্যাটি সমাধান করার সময়, এটি ওপির প্রশ্নের উত্তর দেয় না যা স্পষ্টভাবে একটি কীটির জন্য একাধিক মান ধরে রাখতে বলে for
দাঙ্গা করা হয়েছে

1
এই উত্তরের জন্য Thankশ্বরের ধন্যবাদ। আমি এতই
নির্লিপ্ত


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" } 

জিপ একটি শক্তিশালী সরঞ্জাম এখানে এটি সম্পর্কে আরও পড়ুন http://docs.python.org/2/library/function.html#zip


2
আমি জানি এটি প্রায় 6 বছর বয়সী, কেবল যে এই উত্তরটি পৌঁছেছে তার দিকে ইঙ্গিত করে: জ্যাঙ্গো> = 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())

দয়া করে নোট করুন: _এররলিস্ট পদ্ধতিতে আন্ডারস্কোর queryDict। জ্যাঙ্গো সংস্করণ: ১.০.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'}

জাজানো> = ২.০ এ (পুরানো সংস্করণগুলিতেও কাজ করতে পারে, এটি কেবলমাত্র আমি ব্যবহার করছি), আপনি করতে পারেন QueryDict.dict()(অর্থাত্ request.POST.dict()) এবং এটি মানগুলি যথাযথভাবে ফিরিয়ে দেবে।
লুকা বেজারেরা

2

শুধু যোগ করুন

queryDict=dict(request.GET) অথবা queryDict=dict(QueryDict)

আপনার দর্শন এবং ডেটা অজগর ডিক্ট হিসাবে কোয়ারডিক্টে সংরক্ষণ করা হবে।


1

এইভাবেই আমি এই সমস্যার সমাধান করেছি:

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

1

আমার মতো, আপনি সম্ভবত Dict()অজগর পদ্ধতিগুলির সাথে আরও পরিচিত are যাইহোক, এটি 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.