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

mor*_*ing 5 python django dictionary

我想将ModelForm数据存储在中的数据库中JSONField,以便以后可以根据此数据创建对象,只需调用:

form = ModelForm(data_from_jsonfield_as_querydict)
if form.is_valid():
    object = form.save()
Run Code Online (Sandbox Code Playgroud)

问题一:

我在POST中有数据:

>>> print request.POST
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}
Run Code Online (Sandbox Code Playgroud)

而且我必须将其转换QueryDictdict。但是,如果我打电话给request.POST.dict()我,我会失去字段2的列表值:

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

我尝试使用,request.POST.getlist但随后获得所有值作为列表:

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

我什至无法检查上述循环中的给定值是否为列表实例,因为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']}
Run Code Online (Sandbox Code Playgroud)

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

querydict = QueryDict('', mutable=True)
querydict.update(object.data)
Run Code Online (Sandbox Code Playgroud)

然后:

form = ModelForm(querydict)
Run Code Online (Sandbox Code Playgroud)

问题是,当创建querydictdict与某些值列表实例,所有querydict值都包裹在列表:

print querydict
{u'field-1': [u'value1'], u'field-2': [[u'value-2a', u'value-2b']]}
Run Code Online (Sandbox Code Playgroud)

因此,表单验证失败,field-2因为getlist该字段返回列表列表(具有一个值)而不是值列表。

Ger*_*ert 6

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

post_data = dict(request.POST.lists())
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是所有 `dict` 值都将是列表。当然,我可以使用`{k: v[0] if len(v) == 1 else v for k, v in request.POST.lists()}`,这是对我问题的回答,但是我认为会更简单。 (3认同)

小智 0

我相信

json.dumps(query_dict)

可能就是您正在寻找的。来自JSON 编码器和解码器

  • 不幸的是,“json.dumps(request.POST)”充当“request.POST.dict()”并丢失列表值。 (4认同)