2016-03-03 28 views
3

我想存储ModelForm数据在数据库中,JSONField,以便在将来打造从这个数据对象,只需调用:如何将request.POST转储为字典,维护多个值字段?

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']} 

而我必须转换这个QueryDictdict。但是,如果我叫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)不返回错误,另一方面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) 

的问题是,从dict与某些值列表实例创建querydict时,所有querydict值被包裹在清单:

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

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

+2

这似乎是只有当你动态地构建表单并且无法知道表单在生成时会是什么的时候......在这种情况下,你应该定义你的字段的方式包含您的类型。如果这不是你正在做的事情,你可能想退一步,重新思考这是否是一个很好的方法来解决你试图解决的任何问题(并且真的,把这个问题放在你的问题将允许更有用的答案)。 – kungphu

+0

你能否描述一下你希望将这个样本'POST'转换成预期的'dict'? – zsepi

+0

@kungphu我不认为''QueryDict'转换为'dict'而不会丢失'list'数据是不寻常的。无论如何,我重新编辑了我的问题。 – morning

回答

0

我相信

json.dumps(query_dict)

可能是你在找什么。 从JSON encoder and decoder

+0

不幸的是,'json.dumps(request.POST)'充当'request.POST.dict()'并且失去了列表值。 – morning

2

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

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

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

+0

这个功能的实际实现是[MultiValueDict](https://github.com/django/django/blob/master/django/utils/datastructures.py#L48) – Gert