Примечания к выпуску Django 4.2 - ПОД РАЗРАБОТКОЙ¶
Ожидается в апреле 2023 года
Добро пожаловать в Django 4.2!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы должны знать при переходе с Django 4.1 или более ранней версии. Мы begun the deprecation process for some features.
См. руководство How to upgrade Django to a newer version, если вы обновляете существующий проект.
Совместимость с Python¶
Django 4.2 поддерживает Python 3.8, 3.9, 3.10 и 3.11. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Что нового в Django 4.2¶
Поддержка Psycopg 3¶
Django теперь поддерживает psycopg версии 3.1 или выше. Чтобы обновить ваш код, установите psycopg library, вам не нужно менять ENGINE, так как django.db.backends.postgresql поддерживает обе библиотеки.
Поддержка psycopg2, вероятно, будет устаревшей и удалена в какой-то момент в будущем.
Устранение последствий атаки BREACH¶
GZipMiddleware теперь включает смягчение последствий атаки BREACH. Он добавляет до 100 случайных байтов в gzip-ответы, чтобы затруднить атаки BREACH. Подробнее о технике смягчения атаки читайте в Heal The Breach (HTB) paper.
Незначительные особенности¶
django.contrib.admin¶
- Светлая или темная цветовая тема администратора теперь может быть переключена в пользовательском интерфейсе, а также может быть установлена в соответствии с системными настройками.
- Стек шрифтов администратора теперь предпочитает системные шрифты пользовательского интерфейса и больше не требует загрузки шрифтов. Кроме того, доступны переменные CSS для более удобного переопределения семейств шрифтов по умолчанию.
- Шаблон admin/delete_confirmation.html теперь имеет несколько дополнительных блоков и скриптовых крючков для облегчения настройки.
- Выбранные опции виджетов
filter_horizontalиfilter_verticalтеперь можно фильтровать. - В шаблоне
admin/base.htmlтеперь есть новый блокnav-breadcrumbs, который содержит навигационный ориентир и блокbreadcrumbs. ModelAdmin.list_editableтеперь использует атомарные транзакции при внесении правок.
django.contrib.auth¶
- Число итераций по умолчанию для хешера паролей PBKDF2 увеличено с 390 000 до 480 000.
UserCreationFormтеперь сохраняет поля формы «многие-ко-многим» для пользовательской модели пользователя.
django.contrib.gis¶
- GeoJSON serializer теперь выводит ключ
idдля сериализованных функций, который по умолчанию равен первичному ключу объектов. - Класс
GDALRasterтеперь поддерживаетpathlib.Path. - Класс
GeoIP2теперь поддерживает файлы.mmdb, загруженные с DB-IP. - Виджет шаблона OpenLayers больше не включает встроенный CSS (что также удаляет прежний блок
map_css), чтобы лучше соответствовать строгой политике безопасности содержимого.
django.contrib.postgres¶
- Новый поиск
trigram_strict_word_similar, а также выраженияTrigramStrictWordSimilarity()иTrigramStrictWordDistance()позволяют использовать триграммное строгое сходство слов. - Поиск
arrayfield.overlapтеперь поддерживаетQuerySet.values()иvalues_list()в качестве правой части.
django.contrib.sitemaps¶
- Новый метод
Sitemap.get_languages_for_item()позволяет настроить список языков, для которых отображается элемент.
django.contrib.staticfiles¶
ManifestStaticFilesStorageтеперь заменяет пути к модулям JavaScript в операторахimportиexportих хэшированными аналогами.
Кэш¶
- …
CSRF¶
- …
Декораторы¶
- …
Електронна пошта¶
- …
Отчеты об ошибках¶
- Страница отладки теперь показывает exception notes и fine-grained error locations на Python 3.11+.
Хранение файлов¶
- …
Загрузка файлов в Джанго¶
- …
Формы¶
ModelFormтеперь принимает новую опциюMetaformfield_callbackдля настройки полей формы.modelform_factory()теперь уважает атрибутformfield_callbackвformвMeta.- Сеансовые куки теперь рассматриваются как учетные данные и поэтому скрываются, а в отчетах об ошибках заменяются звездочками (
**********).
Общие представления¶
- …
Интернационализация¶
- Добавлена поддержка и переводы для центральнокурдского языка (Sorani).
LocaleMiddlewareтеперь учитывает язык из запроса, когдаi18n_patterns()используется с аргументомprefix_default_language, установленным вFalse.
Ведение журнала¶
- Регистратор django.db.backends теперь регистрирует запросы управления транзакциями (
BEGIN,COMMITиROLLBACK) на уровнеDEBUG.
Команды управления¶
- Команда
makemessagesтеперь поддерживает локали с частными подтегами, такими какnl_NL-x-informal. - Новая опция
makemigrations --updateобъединяет изменения модели в последнюю миграцию и оптимизирует результирующие операции.
Миграции¶
- Миграции теперь поддерживают сериализацию объектов
enum.Flag.
Модели¶
QuerySetтеперь широко поддерживает фильтрацию против Функции окна за исключением дизъюнктивного поиска фильтра против оконных функций при выполнении агрегации.prefetch_related()теперь поддерживаетPrefetchобъекты с нарезанными кверисетами.- Registering lookups на экземплярах
Fieldтеперь поддерживается. - Новый аргумент
robustдляon_commit()позволяет выполнять действия, которые могут завершиться неудачей после успешной фиксации транзакции базы данных. - Новое выражение
KT()представляет текстовое значение ключа, индекса или преобразования путиJSONField. Nowтеперь поддерживает микросекундную точность в MySQL и миллисекундную точность в SQLite.- Выражения
F(), выводящиеBooleanField, теперь можно отрицать с помощью~F()(оператор инверсии). Modelтеперь предоставляет асинхронные версии некоторых методов, использующих базу данных, с использованием префиксаa:adelete(),arefresh_from_db()иasave().- Менеджеры Related теперь предоставляют асинхронные версии методов, которые изменяют набор связанных объектов, используя префикс
a:aadd(),aclear(),aremove()иaset().
Запросы и ответы¶
StreamingHttpResponseтеперь поддерживает асинхронные итераторы, когда Django обслуживается через ASGI.
Безопасность¶
- …
Сериализация¶
- …
Сигналы¶
- …
Шаблоны¶
- …
Тесты¶
Опция
test --debug-sqlтеперь форматирует SQL-запросы с помощьюsqlparse.Классы
RequestFactory,AsyncRequestFactory,ClientиAsyncClientтеперь поддерживают параметрheaders, который принимает словарь имен и значений заголовков. Это позволяет использовать более естественный синтаксис для объявления заголовков.# Before: self.client.get("/home/", HTTP_ACCEPT_LANGUAGE="fr") await self.async_client.get("/home/", ACCEPT_LANGUAGE="fr") # After: self.client.get("/home/", headers={"accept-language": "fr"}) await self.async_client.get("/home/", headers={"accept-language": "fr"})
URL-адреса¶
- …
Утилиты¶
- Новый параметр
encoderдля функцииdjango.utils.html.json_script()позволяет настроить класс кодировщика JSON. - Частная внутренняя вендорная копия
urllib.parse.urlsplit()теперь отделяет'\r','\n'и'\t'(см. CVE-2022-0391 и bpo-43882). Это сделано для защиты проектов, которые могут неправильно использовать внутреннюю функциюurl_has_allowed_host_and_scheme()вместо того, чтобы использовать одну из документированных функций для обработки перенаправлений URL. Функции Django не были затронуты. - Новая функция
django.utils.http.content_disposition_header()возвращает значение заголовка HTTPContent-Disposition, указанное в RFC 6266.
Валидаторы¶
- Список распространенных паролей, используемых
CommonPasswordValidator, обновляется до последней версии.
Изменения в 4.2, несовместимые с обратными изменениями¶
API бэкенда базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в бэкендах баз данных сторонних производителей.
DatabaseFeatures.allows_group_by_pkудалено, поскольку оно оставалось только для того, чтобы приспособить расширение MySQL, которое было вытеснено надлежащим функциональным обнаружением зависимостей в MySQL 5.7.15. Обратите внимание, чтоDatabaseFeatures.allows_group_by_selected_pksвсе еще поддерживается и должен быть включен, если ваш бэкенд поддерживает обнаружение функциональных зависимостей в предложенияхGROUP BY, как указано в стандартеSQL:1999.
Прекращена поддержка MariaDB 10.3¶
Поддержка MariaDB 10.3 заканчивается в мае 2023 года. Django 4.2 поддерживает MariaDB 10.4 и выше.
Прекращена поддержка MySQL 5.7¶
Поддержка MySQL 5.7 заканчивается в октябре 2023 года. Django 4.2 поддерживает MySQL 8 и выше.
Прекращена поддержка PostgreSQL 11¶
Поддержка PostgreSQL 11 заканчивается в ноябре 2023 года. Django 4.2 поддерживает PostgreSQL 12 и выше.
Установка update_fields в Model.save() теперь может потребоваться¶
Чтобы избежать обновления ненужных столбцов, QuerySet.update_or_create() теперь передает update_fields в вызовы Model.save(). Как следствие, любые поля, измененные в пользовательских методах save(), должны быть добавлены в аргумент ключевого слова update_fields перед вызовом super(). Более подробную информацию см. в разделе Переопределение методов модели.
Разное¶
- Недокументированные
SimpleTemplateResponse.rendering_attrsиTemplateResponse.rendering_attrsпереименованы вnon_picklable_attrs. - Недокументированная функция
django.http.multipartparser.parse_header()удалена. Вместо нее используйтеdjango.utils.http.parse_header_parameters(). - Результат
{% blocktranslate asvar … %}теперь помечен как безопасный для (HTML) вывода. - HTML-атрибут
autofocusв окне поиска администратора удален, так как он может сбивать с толку читателей экрана. - The
makemigrations --checkoption no longer creates missing migration files. - Аргумент
aliasдляExpression.get_group_by_cols()удаляется. - T
- T
- T
- T
- <
- T
Функции, устаревшие в версии 4.2¶
Опция index_together устарела в пользу indexes.¶
Опция Meta.index_together устарела в пользу опции indexes.
Миграция существующих index_together должна обрабатываться как миграция. Например:
class Author(models.Model):
rank = models.IntegerField()
name = models.CharField(max_length=30)
class Meta:
index_together = [["rank", "name"]]
Должно стать:
class Author(models.Model):
rank = models.IntegerField()
name = models.CharField(max_length=30)
class Meta:
indexes = [models.Index(fields=["rank", "name"])]
Выполнение команды makemigrations создаст миграцию, содержащую операцию RenameIndex, которая переименует существующий индекс.
Операция миграции AlterIndexTogether теперь официально поддерживается только для файлов миграции, созданных до версии Django 4.2. По причинам обратной совместимости, она все еще является частью публичного API, и нет планов по ее обесцениванию или удалению, но она не должна использоваться для новых миграций. Вместо этого используйте операции AddIndex и RemoveIndex.
Минимальная поддерживаемая версия JSONField увеличена с 3.5.2 до 3.6.0.¶
JSONField и связанные с ним поиск и агрегаты использовали возможность передачи строковых литералов в кодировке JSON, что вызывало неоднозначность в отношении того, были ли строковые литералы уже закодированы с точки зрения бэкенда базы данных.
Во время периода обесценивания строковые литералы будут пытаться декодировать в JSON, а при успехе будет выдаваться предупреждение, указывающее на передачу вместо них некодированных форм.
Код, который используется для передачи строковых литералов в кодировке JSON:
Document.objects.bulk_create(
Document(data=Value("null")),
Document(data=Value("[]")),
Document(data=Value('"foo-bar"')),
)
Document.objects.annotate(
JSONBAgg("field", default=Value('[]')),
)
Должно стать:
Document.objects.bulk_create(
Document(data=Value(None, JSONField())),
Document(data=[]),
Document(data="foo-bar"),
)
Document.objects.annotate(
JSONBAgg("field", default=[]),
)
Начиная с Django 5.1+ строковые литералы будут неявно интерпретироваться как строковые литералы JSON.
Разное¶
Метод
BaseUserManager.make_random_password()является устаревшим. См. recipes and best practices об использовании модуля Pythonsecretsдля генерации паролей.Шаблонный фильтр
length_isустарел в пользуlengthи оператора==внутри тега{% if %}. Например{% if value|length == 4 %}…{% endif %} {% if value|length == 4 %}True{% else %}False{% endif %}
вместо:
{% if value|length_is:4 %}…{% endif %} {{ value|length_is:4 }}
django.contrib.auth.hashers.SHA1PasswordHasher,django.contrib.auth.hashers.UnsaltedSHA1PasswordHasherиdjango.contrib.auth.hashers.UnsaltedMD5PasswordHasherустарели.django.contrib.postgres.fields.CICharFieldустарел в пользуCharField(db_collation="…")с нечувствительной к регистру недетерминированной коллизией.django.contrib.postgres.fields.CIEmailFieldустарел в пользуEmailField(db_collation="…")с нечувствительной к регистру недетерминированной коллизией.django.contrib.postgres.fields.CITextFieldустарел в пользуTextField(db_collation="…")с нечувствительной к регистру недетерминированной коллизией.Миксин
django.contrib.postgres.fields.CITextустарел.Атрибуты
map_heightиmap_widthвBaseGeometryWidgetустарели, вместо них используйте CSS для определения размера виджетов карты.SimpleTestCase.assertFormsetError()устарел в пользуassertFormSetError().TransactionTestCase.assertQuerysetEqual()устарел в пользуassertQuerySetEqual().Передача позиционных аргументов в
SignerиTimestampSignerустарела в пользу аргументов, содержащих только ключевые слова.