- 3.1
- Версия документации: 6.1
Примечания к выпуску Django 5.2¶
2 апреля 2025 г.
Добро пожаловать в Джанго 5.2!
В этих примечаниях к выпуску описаны новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 5.1 или более ранней версии. Мы начали процесс прекращения поддержки некоторых функций.
См. руководство Обновление Django до новой версии, если вы обновляете существующий проект.
Django 5.2 обозначен как выпуск с долгосрочной поддержкой. Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущей версии LTS, Django 4.2, закончится в апреле 2026 года.
Совместимость версий Python¶
Django 5.2 поддерживает Python 3.10, 3.11, 3.12, 3.13 и 3.14 (начиная с версии 5.2.8). Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Что нового в Джанго 5.2¶
Автоматический импорт моделей в оболочку¶
Команда управления shell теперь автоматически импортирует модели из всех установленных приложений. Вы можете просмотреть дополнительную информацию об импортированных объектах, установив для флага --verbosity значение 2 или более:
$ python -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
...\> py -Wall manage.py shell --verbosity=2
6 objects imported automatically, including:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
Это поведение можно настроить для добавления или удаления автоматического импорта.
Составные первичные ключи¶
Новый django.db.models.CompositePrimaryKey позволяет создавать таблицы с первичным ключом, состоящим из нескольких полей.
Чтобы использовать составной первичный ключ, при определении модели установите для атрибута pk значение CompositePrimaryKey:
from django.db import models
class Release(models.Model):
pk = models.CompositePrimaryKey("version", "name")
version = models.IntegerField()
name = models.CharField(max_length=20)
Дополнительную информацию см. в Составные первичные ключи.
Упрощенное переопределение BoundField¶
До версии 5.2 переопределение Field.get_bound_field() было единственным вариантом использования пользовательского BoundField. Django теперь поддерживает указание следующих атрибутов для настройки рендеринга форм:
BaseRenderer.bound_field_classна уровне проекта,Form.bound_field_classна уровне формы иField.bound_field_classна уровне поля.
Например, чтобы настроить BoundField класса Form:
from django import forms
class CustomBoundField(forms.BoundField):
custom_class = "custom"
def css_classes(self, extra_classes=None):
result = super().css_classes(extra_classes)
if self.custom_class not in result:
result += f" {self.custom_class}"
return result.strip()
class CustomForm(forms.Form):
bound_field_class = CustomBoundField
name = forms.CharField(
label="Your Name",
max_length=100,
required=False,
widget=forms.TextInput(attrs={"class": "name-input-class"}),
)
email = forms.EmailField(label="Your Email")
При рендеринге экземпляра CustomForm включается следующий HTML-код:
<div class="custom">
<label for="id_name">Your Name:</label>
<input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
</div>
<div class="custom">
<label for="id_email">Your Email:</label>
<input type="email" name="email" maxlength="320" required="" id="id_email">
</div>
См. Настройка BoundField для получения более подробной информации об этой функции.
Минорные изменения¶
django.contrib.admin¶
django.contrib.admindocs¶
Ссылки на компоненты в строках документации теперь поддерживают настраиваемый текст ссылки в формате
:role:`link text <link>`. Дополнительную информацию смотрите в разделе помощники по документации.Страницы модели <admindocs-model-reference> теперь доступны только пользователям с соответствующими разрешениями на просмотр или изменение.
django.contrib.auth¶
Число итераций по умолчанию для хэшера паролей PBKDF2 увеличено с 870 000 до 1 000 000.
Теперь предусмотрены следующие новые асинхронные методы с использованием префикса
a:Серверные части аутентификации теперь могут предоставлять асинхронные реализации, которые используются при вызове функций асинхронной аутентификации (например,
aauthenticate()), чтобы уменьшить переключение контекста, что повышает производительность. Дополнительную информацию см. в разделе добавление асинхронного интерфейса.Классы проверки паролей <included-password-validators>` теперь имеют новый метод
get_error_message(), который можно переопределить в подклассах для настройки сообщений об ошибках.
django.contrib.gis¶
GDAL теперь поддерживает изогнутые геометрии CurvePolygon, CompoundCurve, CircularString, MultiSurface и MultiCurve через новое свойство
OGRGeometry.has_curveиOGRGeometry.get_linear_geometry()иOGRGeometry.get_curve_geometry().
Серверные базы данных¶
Соединения MySQL теперь по умолчанию используют набор символов
utf8mb4вместоutf8, который является псевдонимом устаревшего набора символовutf8mb3.Серверные части Oracle теперь поддерживают пулы соединений, установив
"pool"в частиOPTIONSконфигурации вашей базы данных.
Декораторы¶
method_decorator()теперь поддерживает перенос методов асинхронного представления.
Электронная почта¶
Элементы кортежей
EmailMessage.attachmentsиEmailMultiAlternatives.attachmentsтеперь называются кортежами, а не обычными кортежами.EmailMultiAlternatives.alternativesтеперь представляет собой список именованных кортежей, а не обычных кортежей.Новый метод
body_contains()возвращает логическое значение, указывающее, содержится ли предоставленный текст вbodyэлектронного письма и во всех прикрепленных альтернативах MIME-типаtext/*.
Отчеты об ошибках¶
Атрибут
SafeExceptionReporterFilter.hidden_settingsтеперь считает значения конфиденциальными, если их имя включаетAUTH.
Формы¶
Новый виджет формы
ColorInputпредназначен для ввода цвета в шестнадцатеричном форматеrrggbbи отображается как<input type="color" ...>. Некоторые браузеры поддерживают визуальный интерфейс выбора цвета для этого типа ввода.Новый виджет формы
SearchInputпредназначен для ввода поисковых запросов и отображается как<input type="search" ...>.Новый виджет формы
TelInputпредназначен для ввода телефонных номеров и отображается как<input type="tel" ...>.Новый аргумент field_id для :class:~django.forms.ErrorList позволяет добавить атрибут HTML id в шаблон ошибки. Подробности смотрите в
ErrorList.field_id.Свойство
aria_describedbyдобавлено вBoundField, чтобы упростить использование этого HTML-атрибута в шаблонах.Чтобы улучшить доступность для пользователей программ чтения с экрана, используется
aria-describedby, чтобы связать поля формы с их сообщениями об ошибках. Подробнее см. как отображаются ошибки формы.Новый объект ресурса
Scriptдоступен для добавления пользовательских HTML-атрибутов в JavaScript в медиа-форме. Дополнительную информацию см. в разделе «Пути как объекты <form-media-asset-objects>».
Команды управления¶
При запуске
runserverотображается новое предупреждение, указывающее, что он непригоден для производства. Это предупреждение можно подавить, установив для переменной средыDJANGO_RUNSERVER_HIDE_WARNINGзначение"true".Команды
makemigrationsиmigrateимеют новый атрибутCommand.autodetector, который можно переопределить подклассами, чтобы использовать собственный класс автодетектора.Новый метод
BaseCommand.get_check_kwargs()можно переопределить в пользовательских командах для управления выполнением системных проверок, например. чтобы выбрать проверки, зависящие от базы данных.
Миграции¶
Новая операция
AlterConstraint— это пустая операция, которая изменяет ограничения без удаления и повторного создания ограничений в базе данных.
Модели¶
Предложение
SELECT, созданное при использованииQuerySet.values()иQuerySet.values_list(), теперь соответствует указанному порядку выражений, на которые ссылаются. Раньше порядок основывался на наборе нелогичных правил, которые делали комбинирование запросов с помощью таких методов, какQuerySet.union(), непредсказуемым.Добавлена поддержка проверки ограничений модели, использующих
GeneratedField.Новый атрибут
Expression.set_returningуказывает, что выражение содержит функцию, возвращающую множество, обеспечивающую оценку подзапроса. Это необходимо для многих функций Postgres, возвращающих множество.CharField.max_lengthбольше не требуется устанавливать в SQLite, который поддерживает неограниченное количество столбцовVARCHAR.QuerySet.explain()теперь поддерживает опцииmemoryиserializeв PostgreSQL 17+.Новая функция базы данных
JSONArrayпринимает список имен полей или выражений и возвращает массив JSON, содержащий эти значения.Новый атрибут
Expression.allows_composite_expressionsуказывает, что выражение позволяет составным выражениям, например, поддерживать составные первичные ключи.
Запросы и ответы¶
Новое свойство
HttpResponse.textобеспечивает строковое представлениеHttpResponse.content.Новый метод
HttpRequest.get_preferred_type()можно использовать для запроса предпочтительного типа носителя, который принимает клиент.Новый аргумент
preserve_requestдляHttpResponseRedirectиHttpResponsePermanentRedirectопределяет, используются ли коды состояния HTTP 302/307 или 301/308 соответственно.Новый аргумент
preserve_requestдляredirect()позволяет указать пользовательскому агенту повторно использовать метод и тело HTTP во время перенаправления с использованием определенных кодов состояния.
Сериализация¶
Каждый формат сериализации теперь определяет класс
Deserializer, а не функцию, чтобы улучшить расширяемость при определении пользовательского формата сериализации <custom-serialization-formats>`.
Шаблоны¶
Новый декоратор
simple_block_tag()позволяет создавать простые теги блоков, которые могут принимать и использовать раздел шаблона.
Тесты¶
Фреймы стека из пользовательских утверждений Django теперь скрыты. Это облегчает чтение ошибок теста и позволяет
test --pdbнапрямую войти в метод теста, который дал сбой.Данные, загруженные из
fixturesи из миграций, включенных с помощью serialized_rollback=True, теперь доступны во времяTransactionTestCase.setUpClass().
URL-адреса¶
reverse()иreverse_lazy()теперь принимают ключевые аргументыqueryиfragment, что позволяет добавлять строку запроса и/или идентификатор фрагмента в сгенерированный URL-адрес соответственно.
Утилиты¶
SafeStringтеперь возвращаетNotImplementedв__add__для нестроковых значений в правой части. Это соответствует поведению добавленияstrи позволяет использовать__radd__, если он доступен.format_html_join()теперь поддерживает итерацию отображений, передавая их содержимое в качестве аргументов ключевого слова вformat_html().
Изменения обратной несовместимости в версии 5.2¶
Серверный API базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в сторонних базах данных.
Новый метод
Model._is_pk_set()позволяет проверить, определен ли первичный ключ экземпляра модели.BaseDatabaseOperations.adapt_decimalfield_value()теперь не выполняет никаких операций и просто возвращает заданное значение.
django.contrib.gis¶
Поддержка PostGIS 3.0 удалена.
Поддержка GDAL 3.0 удалена.
Прекращена поддержка PostgreSQL 13.¶
Поддержка исходной версии PostgreSQL 13 заканчивается в ноябре 2025 года. Django 5.2 поддерживает PostgreSQL 14 и выше.
Изменен набор символов соединения MySQL по умолчанию.¶
Соединения MySQL теперь по умолчанию используют набор символов utf8mb4 вместо utf8, который является псевдонимом устаревшего набора символов utf8mb3. utf8mb3 можно указать в разделе OPTIONS параметра DATABASES, если это необходимо для устаревших баз данных.
Разнообразный¶
Добавление
EmailMultiAlternatives.alternativesтеперь поддерживается только с помощью методаattach_alternative().Минимальная поддерживаемая версия gettext увеличена с 0,15 до 0,19.
HttpRequest.accepted_typesтеперь сортируется по предпочтениям клиента на основе заголовкаAcceptзапроса.Атрибуты
UniqueConstraint.violation_error_codeиUniqueConstraint.violation_error_messageтеперь используются всегда, если они предусмотрены. Раньше они игнорировались, еслиUniqueConstraint.fieldsбыл установлен безUniqueConstraint.condition.Контекстный процессор
debug()больше не включен в шаблон проекта по умолчанию.Следующие методы теперь имеют параметр
alters_data=Trueдля предотвращения побочных эффектов при рендеринге контекста шаблона <alters-data-description>`:Минимальная поддерживаемая версия oracledb увеличена с 1.3.2 до 2.3.0.
Встроенные агрегатные функции, принимающие только один аргумент (
Avg,Count,Max,Min,StdDev,SumиVariance), теперь вызываютTypeErrorпри вызове с неверным количеством аргументов.
Функции, устаревшие в версии 5.2¶
Разнообразный¶
Аргумент
allдля функцииdjango.contrib.staticfiles.finders.find()устарел в пользу аргументаfind_all.Резервные варианты к
request.userиrequest.auser(), когдаuserимеет значениеNoneвdjango.contrib.auth.login()иdjango.contrib.auth.alogin()соответственно, считаются устаревшими.Аргумент ключевого слова ordering для специальных функций агрегации PostgreSQL django.contrib.postgres.aggregates.ArrayAgg, django.contrib.postgres.aggregates.JSONBAgg и django.contrib.postgres.aggregates.StringAgg устарел в пользу аргументаorder_by.
Поддержка подклассов RemoteUserMiddleware, которые переопределяют
process_request()без переопределенияaprocess_request(), устарела.