Я хочу, чтобы хранить 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
для этого поля возвращает список списков (с одним значением), а не список значений.
Это кажется, что было бы необходимо только, если вы создаете формы динамически и не имеют возможности узнать, что будет в форме, когда он генерируется ... в этом случае вы, вероятно, следует либо определения своего полей, которые включают ваш тип. Если это не то, что вы делаете, возможно, вы захотите отступить и переосмыслить, является ли это хорошим подходом к любой проблеме, которую вы пытаетесь решить (и, действительно, включение этого вопроса в ваш вопрос позволит получить гораздо более полезные ответы). – kungphu
Не могли бы вы описать ожидаемый 'dict', который вы хотели бы преобразовать в этот образец' POST'? – zsepi
@kungphu Я не думаю, что преобразование 'QueryDict' в' dict' без потери данных 'list' является чем-то необычным. Во всяком случае, я снова отредактировал свой вопрос. – morning