Класс QueryDict
QueryDict - это класс, наследующий от dict, который используется в Django
для представления параметров запроса. Основное отличие от обычного словаря
заключается в том, что QueryDict может хранить несколько значений
для одного ключа, что часто встречается в HTTP-запросах, например,
при работе с множественными полями форм (<select multiple>)
или при передаче повторяющихся параметров в URL.
Объект QueryDict создается автоматически для каждого запроса
и доступен через атрибуты request.GET и request.POST
в Django-представлениях. По умолчанию QueryDict является иммутабельным
(неизменяемым), что предотвращает случайное изменение данных запроса.
Для создания изменяемой копии используется метод copy.
Синтаксис
class QueryDict(query_string, mutable=False, encoding=None)
Параметры конструктора:
-
query_string- строка запроса (например, 'key1=value1&key2=value2') -
mutable- флаг, определяющий, будет ли объект изменяемым (по умолчаниюFalse) -
encoding- кодировка для декодирования параметров (по умолчанию используется кодировка Django)
Основные методы
QueryDict предоставляет несколько ключевых методов для работы с данными:
-
get(key, default=None)- возвращает последнее значение для ключа -
getlist(key, default=None)- возвращает список всех значений для ключа -
urlencode(safe=None)- кодирует данные в строку запроса -
copy- возвращает изменяемую копию объекта -
setlist(key, list_)- устанавливает список значений для ключа -
appendlist(key, item)- добавляет значение к списку для ключа -
lists- возвращает итератор по парам (ключ, список значений)
Пример
Рассмотрим базовое использование QueryDict для получения параметров из строки запроса:
from django.http import QueryDict
# Создаем QueryDict из строки запроса
query = QueryDict('name=John&age=30&hobby=reading&hobby=swimming')
# Получаем значения
name = query.get('name')
age = query.get('age')
hobbies = query.getlist('hobby')
print(name)
print(age)
print(hobbies)
Результат выполнения кода:
"John"
"30"
['reading', 'swimming']
Как видно из примера, get возвращает только последнее значение
для ключа 'hobby', а getlist возвращает все значения.
Пример
Продемонстрируем работу с изменяемым QueryDict и модификацию данных:
from django.http import QueryDict
# Создаем неизменяемый QueryDict
query = QueryDict('a=1&a=2&b=3')
# Пытаемся изменить - получим ошибку
try:
query['a'] = 'new value'
except AttributeError as err:
print(err)
# Создаем изменяемую копию
mutable_query = query.copy()
mutable_query['a'] = 'new value'
mutable_query.appendlist('c', '4')
mutable_query.appendlist('c', '5')
print(mutable_query.get('a'))
print(mutable_query.getlist('c'))
print(mutable_query.urlencode())
Результат выполнения кода:
"This QueryDict instance is immutable"
"new value"
['4', '5']
"a=new+value&b=3&c=4&c=5"
Обратите внимание, что метод copy создает новую изменяемую копию,
позволяя безопасно модифицировать данные запроса без изменения оригинала.
Пример
Работа с QueryDict в Django-представлении на примере обработки GET-параметров:
from django.shortcuts import render
from myapp.models import Article
def article_list(request):
# Получаем параметры из GET-запроса
category = request.GET.get('category')
tags = request.GET.getlist('tags')
# Фильтруем статьи
articles = Article.objects.all()
if category:
articles = articles.filter(category=category)
if tags:
articles = articles.filter(tags__name__in=tags)
# Кодируем параметры для сохранения в URL
query_string = request.GET.urlencode()
return render(request, 'articles/list.html', {
'articles': articles,
'query_string': query_string,
})
В этом примере мы получаем параметры 'category' и 'tags'
из строки запроса, используем их для фильтрации статей
и кодируем обратно в строку запроса с помощью urlencode.
Метод getlist позволяет корректно обрабатывать множественные
теги, переданные как ?tags=python&tags=django.
Пример
Рассмотрим использование QueryDict для создания строки запроса из словаря:
from django.http import QueryDict
# Создаем QueryDict из словаря
data = {
'name': 'Alice',
'interests': ['coding', 'reading', 'gaming'],
'active': 'true'
}
# Преобразуем в QueryDict
query = QueryDict('', mutable=True)
query.update(data)
# Кодируем в строку запроса
query_string = query.urlencode()
print(query_string)
# Декодируем обратно
decoded = QueryDict(query_string)
print(decoded.get('name'))
print(decoded.getlist('interests'))
Результат выполнения кода:
"name=Alice&interests=coding&interests=reading&interests=gaming&active=true"
"Alice"
['coding', 'reading', 'gaming']
Этот пример демонстрирует, как можно преобразовывать данные
между разными форматами с помощью QueryDict.