2015-08-10 3 views
4

Я искал преобразование dict в QueryDict в моем проекте django. Для объяснения существует пара ссылок (Django: Can I create a QueryDict from a dictionary? и How to change a django QueryDict to Python Dict?). Это мой простой словарь, который я хочу преобразовать abc = {'a': 1, 'b':[1,2,3]}. Я попробовал этот подход:В чем разница между QueryDict и MultiValueDict?

from django.http import QueryDict 
from django.utils.datastructures import MultiValueDict 
abc = { 'a': 1, 'b':[1,2,3]} 
mdict = MultiValueDict(abc) 
qdict = QueryDict(mdict) 

Это след ошибки я получаю

/usr/lib/python2.7/urlparse.pyc in parse_qsl(qs, keep_blank_values, strict_parsing) 
407  Returns a list, as G-d intended. 
408  """ 
409  pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] 
410  r = [] 
411  for name_value in pairs: 
AttributeError: 'MultiValueDict' object has no attribute 'split' 

Почему это не удалось, и как я могу получить это сделано? Каковы различия между MultiValueDict и QueryDict?

ответ

2

MultiValueDict является словарем подкласс, который может обрабатывать несколько значений, назначенных key.So вы должны пройти values из dict в list. здесь, 1->[1].

В объекте HttpRequest, ГЭТ и POST атрибуты являются экземплярами django.http.QueryDict, словарю как класс заказной, чтобы иметь дело с несколькими значениями для того же ключа. Это необходимо, потому что некоторые элементы HTML-формы, в частности, передают несколько значений для одного и того же ключа.

QueryDicts по запросу.POST и request.GET будут неизменными при доступе в обычном цикле запроса/ответа. Чтобы получить измененную версию, вам нужно использовать .copy().

Затем MultiValueDict можно преобразовать в QueryDict в

abc = { 'a': [1], 'b':[1,2,3]} 
mdict = MultiValueDict(abc) 
qdict = QueryDict('', mutable=True) 
qdict.update(mdict) 
>>>QueryDict: {u'a': [1], u'b': [1, 2, 3]}> 
>>>dict(qdict.iterlists()) 
{u'a': [1], u'b': [1, 2, 3]} 
>>>qdict.getlist('b') 
[1, 2, 3] 
3

QueryDict - это специализированный класс MultiValueDict. Единственное существенное отличие между ними заключается в том, что QueryDict по умолчанию неизменен.

Цитирую QueryDict строку документации: -

Специализированный MultiValueDict, который представляет собой строку запроса. QueryDict может использоваться для представления данных GET или POST. Это подклассы MultiValueDict, поскольку ключи в таких данных могут быть повторены, например в данных из формы с полем. По умолчанию QueryDicts неизменяемы, хотя метод copy() всегда будет возвращать изменяемую копию.

Вы можете проконсультироваться сам код - QueryDict code

Что касается инициализации Словаре запросов от многозначного Словаре обеспокоен, QueryDict не допускает прохождение любого DIC в __init__. Наверное, это надзор с их стороны.

1

Из определения django.http.request.QueryDict:

""» специализированного MultiValueDict, который представляет собой запрос string QueryDict может использоваться для представления данных GET или POST. Подклассы MultiValueDict, поскольку ключи в таких данных могут быть повторены, поскольку в позиция в данных из формы с полем. По умолчанию QueryDicts неизменяемы, хотя метод copy() всегда будет возвращать изменяемую копию. Оба ключа и значения, установленные для этого класса, преобразуются из заданной кодировки (по умолчанию DEFAULT_CHARSET) в unicode. «» «

А из определения django.utils.datastructures.MultiValueDict:

„“» Подкласс словаря настроенного для обработки нескольких значений для того же ключа .

д = MultiValueDict ({ 'имя': [ 'Адриан', 'Саймон'], 'позиция': [ 'Разработчик']}) д [ 'имя'] «Саймон ' d.getlist (' имя ') [' Адриан», 'Саймон'] d.getlist ('doesnotexist') [] d.getlist ('doesnotexist', [ 'Адриан', 'Саймон']) ['Adrian', 'Simon'] d.get ('lastname', 'nonexistent') 'nonexistent' d.setlist ('lastname', ['Holovaty', 'Willison']) Этот класс существует, чтобы решить проблему раздражения, вызванную cgi.parse_qs, , которая возвращает список для каждого ключа, даже если большинство веб-форм представляют одиночные пары имя-значение. ""»

Таким образом, будучи дочерним классом MultiValueDict, QueryDict имеет дополнительное свойство быть неизменны. И это главная точка расхождения.

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