我想将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
返回列表列表(包含一个值)而不是值列表。
答案 0 :(得分:3)
您可以使用lists()
。该格式与dict
构造函数兼容。
post_data = dict(request.POST.lists())
答案 1 :(得分:0)
答案 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))