如何将request.POST转储到dict,维护多个值字段?

时间:2016-03-03 08:17:56

标签: python django dictionary

我想将ModelForm数据存储在JSONField的数据库中,以便以后能够从这些数据中创建对象,只需调用:

form = ModelForm(data_from_jsonfield_as_querydict)
if form.is_valid():
    object = form.save()

问题1:

我在POST中有数据:

>>> print request.POST
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}

我必须将此QueryDict转换为dict。但是,如果我拨打request.POST.dict(),我会丢失表格字段2:

>>> print request.POST.dict()
{'field-1': 'value1', 'field-2': 'value-2b'}

我尝试使用request.POST.getlist,但后来我将所有值都作为列表获取:

>>> for k in request.POST.keys():
...     print request.POST.getlist(k)
[u'value1']
[u'value-2a', u'value-2b']

我甚至无法检查上面循环中的给定值是否为列表实例,因为request.POST.get(k)如果值为list则不返回错误,另一方面request.POST[k]每次都返回MultiValueDictKeyError字段。

我想到的唯一解决方案是循环遍历getlist()获取的所有字段并将单值列表转换为字符串,但在我看来似乎有点过分。

问题2:

假设问题1已解决且我有dict表格数据存储在数据库中,如下所示:

# object.data
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}

当我想使用上面的dict作为表单数据创建对象时,我必须将其转换为QueryDict,这可以通过以下方式完成:

querydict = QueryDict('', mutable=True)
querydict.update(object.data)

然后:

form = ModelForm(querydict)

问题在于,使用列表实例的某些值从querydict创建dict时,所有querydict值都会包含在列表中:

print querydict
{u'field-1': [u'value1'], u'field-2': [[u'value-2a', u'value-2b']]}

由于这个原因,field-2的表单验证失败,因为该字段的getlist返回列表列表(包含一个值)而不是值列表。

3 个答案:

答案 0 :(得分:3)

您可以使用lists()。该格式与dict构造函数兼容。

post_data = dict(request.POST.lists())

答案 1 :(得分:0)

我相信

json.dumps(query_dict)

可能就是你要找的东西。 来自JSON encoder and decoder

答案 2 :(得分:0)

您必须将 MultiValueDict 与 QueryDict 一起添加,

from django.http.request import QueryDict, MultiValueDict

dictionary = {'key_1': ['1'], 'key_2': ['1', '2'], }
query_dict = QueryDict('', mutable=True)
query_dict.update(MultiValueDict(dictionary))