РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
340 of 818 menu

Класс 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.

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

  • атрибут GET,
    который предоставляет доступ к GET-параметрам запроса через QueryDict
  • атрибут POST,
    который предоставляет доступ к POST-данным запроса через QueryDict
  • метод get,
    который возвращает значение для ключа из QueryDict
  • метод getlist,
    который возвращает список значений для ключа из QueryDict
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить