簡體   English   中英

如何將 django QueryDict 更改為 Python Dict?

[英]How to change a django QueryDict to Python Dict?

假設我有以下 QueryDict:

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

我想要一本字典,例如:

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

(我不在乎 unicode 符號u是留下還是消失。)

如果我按照django 站點的建議執行queryDict.dict() ,我會丟失屬於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)

只需簡單地添加

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

在您的視圖中,數據將作為 python Dict 保存在 querDict 中。

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

請注意:queryDict 的queryDict方法中的下划線_ Django 版本:1.5.1

dict(request.POST)返回一個帶有數組包裝值的奇怪 python 字典。

{'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.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']

哪個是對的。

這就是我解決這個問題的方法:

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

我嘗試了dict(request.POST)request.POST.dict()並意識到如果您的request.POST中嵌套了例如'var1':['value1', 'value2'] list值,則后者( request.POST.dict() ) 只允許我訪問嵌套列表中的最后一項,而前者( dict(request.POST) ) 允許我訪問嵌套列表中的所有項目。

我希望這可以幫助別人。

和我一樣,你可能更熟悉 Python 中的Dict()方法。 但是, QueryDict()也是一個易於使用的對象。 例如,也許您想從request.GET QueryDict()中獲取值。

你可以這樣做: request.GET.__getitem__(<key>)

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

你可以使用一個簡單的技巧

queryDict._mutable = False
# Change queryDict
your_dict = {'num': [0], 'var1':['value1', 'value2'], 'var2':['8']}
queryDict.upate(your_dict)
# reset the state
queryDict._mutable = True 

我認為這會更好地幫助你: 這個 QueryDict 實例是不可變的

    user_obj = get_object_or_404(NewUser,id=id)
    if request.method == 'POST':
        queryDict = request.POST
        data = dict(queryDict)
        print(data['user_permissions[]'])
        user_obj.user_permissions.clear()
        user_obj.user_permissions.set(data['user_permissions[]'])
        return HttpResponse('Done')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM