Класс QueryDict

QueryDict - это класс, наследующий от dict, который используется в Django для представления параметров запроса. Основное отличие от обычного словаря заключается в том, что QueryDict может хранить несколько значений для одного ключа, что часто встречается в HTTP-запросах, например, при работе с множественными полями форм (<select multiple>) или при передаче повторяющихся параметров в URL.

Объект QueryDict создается автоматически для каждого запроса и доступен через атрибуты request.GET и request.POST в Django-представлениях. По умолчанию QueryDict является иммутабельным (неизменяемым), что предотвращает случайное изменение данных запроса. Для создания изменяемой копии используется метод copy.

Синтаксис

pythonclass QueryDict(query_string, mutable=False, encoding=None)

Параметры конструктора:

Основные методы

QueryDict предоставляет несколько ключевых методов для работы с данными:

Пример

Рассмотрим базовое использование QueryDict для получения параметров из строки запроса:

pythonfrom 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)

Результат выполнения кода:

python"John"
"30"
['reading', 'swimming']

Как видно из примера, get возвращает только последнее значение для ключа 'hobby', а getlist возвращает все значения.

Пример

Продемонстрируем работу с изменяемым QueryDict и модификацию данных:

pythonfrom 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())

Результат выполнения кода:

python"This QueryDict instance is immutable"
"new value"
['4', '5']
"a=new+value&b=3&c=4&c=5"

Обратите внимание, что метод copy создает новую изменяемую копию, позволяя безопасно модифицировать данные запроса без изменения оригинала.

Пример

Работа с QueryDict в Django-представлении на примере обработки GET-параметров:

pythonfrom 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 для создания строки запроса из словаря:

pythonfrom 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'))

Результат выполнения кода:

python"name=Alice&interests=coding&interests=reading&interests=gaming&active=true"
"Alice"
['coding', 'reading', 'gaming']

Этот пример демонстрирует, как можно преобразовывать данные между разными форматами с помощью QueryDict.

Смотрите также

  • атрибут GET,
    который предоставляет доступ к GET-параметрам запроса через QueryDict
  • атрибут POST,
    который предоставляет доступ к POST-данным запроса через QueryDict
  • метод get,
    который возвращает значение для ключа из QueryDict
  • метод getlist,
    который возвращает список значений для ключа из QueryDict