2016-03-03 27 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