Как обработать request.GET с несколькими переменными для одного и того же параметра в Django

В представлении Django вы можете получить доступ к request.GET['variablename'], поэтому, по вашему мнению, вы можете сделать что-то вроде этого:

myvar = request.GET['myvar']

Фактический тип объекта request.GET['myvar']:

<class 'django.http.QueryDict'>

Теперь, если вы хотите передать несколько переменных с одним и тем же именем параметра, то есть:

http://example.com/blah/?myvar=123&myvar=567

Вы хотите вернуть list python для параметра myvar, а затем сделать что-то вроде этого:

for var in request.GET['myvar']:
    print(var)

Однако при попытке получить только последнее значение, переданное в URL, т.е. в приведенном выше примере вы получите 567, и результат в оболочке будет:

5
6
7

Однако, когда вы печатаете request.GET кажется, что у него есть list т.е.

<QueryDict: {u'myvar': [u'123', u'567']}>

Ok Update: он предназначен для возврата последнего значения, мой вариант использования мне нужен список.

из Django документов:

QueryDict. getitem (key) Возвращает значение для данного ключа. Если ключ имеет более одного значения, getitem() возвращает последнее значение. Вызывает django.utils.datastructures.MultiValueDictKeyError, если ключ не существует. (Это подкласс Python стандартного KeyError, поэтому вы можете придерживаться перехвата KeyError

QueryDict.getlist(key) Возвращает данные с запрошенным ключом в виде списка Python. Возвращает пустой список, если ключ не существует. Он гарантированно вернет какой-то список.

Обновление: если кто-то знает, почему django dev сделал это, пожалуйста, дайте мне знать, кажется, что показывать список нелогично, и он не ведет себя как один. Не очень питонично!

Ответ 1

Вы хотите getlist() функцию объекта GET:

request.GET.getlist('myvar')

Ответ 2

Другим решением является создание копии объекта запроса... Обычно вы не можете перебирать объект request.GET или request.POST, но вы можете делать такие операции над копией:

res_set = request.GET.copy()
for item in res_set['myvar']:
    item
...