2016-03-03 1 views
3

Я хочу, чтобы хранить ModelForm данные в базе данных, в JSONField, чтобы иметь возможность создать объект из этих данных позже, просто позвонив:Как сбрасывать request.POST на dict, поддерживая несколько полей значений?

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) не возвращает ошибку, если значение является списком, а с другой стороны 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']]} 

По этой причине форма проверки fail для field-2, потому что getlist для этого поля возвращает список списков (с одним значением), а не список значений.

+2

Это кажется, что было бы необходимо только, если вы создаете формы динамически и не имеют возможности узнать, что будет в форме, когда он генерируется ... в этом случае вы, вероятно, следует либо определения своего полей, которые включают ваш тип. Если это не то, что вы делаете, возможно, вы захотите отступить и переосмыслить, является ли это хорошим подходом к любой проблеме, которую вы пытаетесь решить (и, действительно, включение этого вопроса в ваш вопрос позволит получить гораздо более полезные ответы). – kungphu

+0

Не могли бы вы описать ожидаемый 'dict', который вы хотели бы преобразовать в этот образец' POST'? – 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], если len (v) == 1 else v для k, v в запросе.POST.lists()}', и это ответ на мой вопрос, однако я думал, что это было бы проще. – morning

+0

Фактическая реализация этой функции - [MultiValueDict] (https://github.com/django/django/blob/master/django/utils/datastructures.py#L48) – Gert

Смежные вопросы