Короткий ответ
QueryDict — специальный неизменяемый (по умолчанию) словарь-подобный класс Django для request.GET и request.POST, поддерживающий несколько значений для одного ключа.
Как это работает подробнее
request.GET содержит параметры строки запроса (query string), request.POST — данные, отправленные в теле формы с Content-Type: application/x-www-form-urlencoded или multipart/form-data. Оба объекта — экземпляры QueryDict, похожего на обычный dict, но с методами getlist() для множественных значений одного ключа.
Пример кода
example.py
def search_view(request):
query = request.GET.get("q", "")
tags = request.GET.getlist("tag") # например ?tag=a&tag=b -> ["a", "b"]
return JsonResponse({"query": query, "tags": tags})
# GET /search?q=python&tag=web&tag=backend
# -> {"query": "python", "tags": ["web", "backend"]}Что использовать на практике
- Практика. Для чтения одного значения используют
request.GET.get('q', ''); для множественных (например, чекбоксы с одинаковым именем) —request.GET.getlist('tags'). Для JSON-тела API (не формы)request.POSTбудет пустым — нужно разбиратьrequest.bodyвручную или использовать DRF.
Подводные камни
- Риск. Пытаются читать JSON-тело через
request.POSTи получают пустой результат, не понимая разницы между form-encoded и JSON телом; пытаются изменитьQueryDictнапрямую, получаяQueryDict is immutableпри обычномrequest.GET.