• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

Примечания к выпуску Django 3.0

2 декабря 2019 г.

Добро пожаловать в Джанго 3.0!

Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 2.2 или более ранней версии. Мы отменили некоторые функции, цикл устаревания которых достиг конца, и мы начали процесс прекращения поддержки некоторых функций.

См. руководство Обновление Django до новой версии, если вы обновляете существующий проект.

Совместимость версий Python

Django 3.0 поддерживает Python 3.6, 3.7, 3.8 и 3.9 (начиная с версии 3.0.11). Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.

Серия Django 2.2.x — последняя, ​​поддерживающая Python 3.5.

Поддержка сторонних библиотек для более старой версии Django

После выпуска Django 3.0 мы предлагаем сторонним авторам приложений прекратить поддержку всех версий Django до 2.2. В это время вы сможете запускать тесты вашего пакета с помощью python -Wd, чтобы появлялись предупреждения об устаревании. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 3.0.

Что нового в Джанго 3.0

Поддержка МариаДБ

Django теперь официально поддерживает MariaDB 10.1 и выше. Дополнительную информацию см. в Заметках MariaDB.

Поддержка АСГИ

Django 3.0 начинает наш путь к полной асинхронности Django, обеспечивая поддержку работы в качестве приложения ASGI.

Это в дополнение к существующей поддержке WSGI. Django намерен поддерживать оба варианта в обозримом будущем. Однако функции асинхронности будут доступны только для приложений, работающих под управлением ASGI.

На этом этапе поддержка асинхронности применяется только к внешнему приложению ASGI. Внутри все остается синхронным. Асинхронное промежуточное ПО, представления и т. д. пока не поддерживаются. Однако вы можете использовать промежуточное программное обеспечение ASGI для приложения Django, что позволит вам комбинировать Django с другими платформами ASGI.

Нет необходимости переключать приложения, если вы не хотите начать экспериментировать с асинхронным кодом, но у нас есть документация по развертыванию с помощью ASGI, если вы хотите узнать больше.

Обратите внимание, что в качестве побочного эффекта этого изменения Django теперь знает об асинхронных циклах событий и будет блокировать вызов кода, помеченного как «асинхронно небезопасный», например операций ORM, из асинхронного контекста. Если вы раньше использовали Django из асинхронного кода, это может сработать, если вы делали это неправильно. Если вы видите ошибку SynchronousOnlyOperation, внимательно изучите свой код и переместите все операции с базой данных в синхронный дочерний поток.

Ограничения исключения в PostgreSQL

Новый класс ExclusionConstraint позволяет добавлять ограничения исключения в PostgreSQL. Ограничения добавляются в модели с помощью опции Meta.constraints.

Фильтровать выражения

Выражения, выводящие BooleanField, теперь можно использовать непосредственно в фильтрах QuerySet, без необходимости сначала аннотировать, а затем фильтровать по аннотации.

Перечисления для выбора полей модели

Пользовательские типы перечисления TextChoices, IntegerChoices и Choices теперь доступны как способ определения Field.choices. Типы TextChoices и IntegerChoices предусмотрены для текстовых и целочисленных полей. Класс Choices позволяет определить совместимое перечисление для других конкретных типов данных. Эти пользовательские типы перечислений поддерживают удобочитаемые метки, которые можно перевести и получить к ним доступ через свойство перечисления или его членов. См. Типы перечисления для получения более подробной информации и примеров.

Минорные изменения

django.contrib.admin

  • Добавлена ​​поддержка атрибута admin_order_field для свойств в ModelAdmin.list_display.

  • Новый метод ModelAdmin.get_inlines() позволяет указывать встроенные строки на основе запроса или экземпляра модели.

  • Библиотека Select2 обновлена ​​с версии 4.0.3 до 4.0.7.

  • jQuery обновлен с версии 3.3.1 до 3.4.1.

django.contrib.auth

  • Новый атрибут reset_url_token в PasswordResetConfirmView позволяет указать параметр токена, отображаемый как компонент URL-адресов сброса пароля.

  • Добавлен класс BaseBackend для упрощения настройки серверов аутентификации.

  • Добавлен метод get_user_permissions() для зеркалирования существующего метода get_group_permissions().

  • Добавлен HTML-атрибут autocomplete к виджетам полей имени пользователя, электронной почты и пароля в django.contrib.auth.forms для лучшего взаимодействия с менеджерами паролей браузера.

  • createsuperuser теперь возвращается к переменным среды для пароля и обязательных полей, когда соответствующий аргумент командной строки не указан в неинтерактивном режиме.

  • REQUIRED_FIELDS теперь поддерживает ManyToManyFields.

  • Новый метод UserManager.with_perm() возвращает пользователей, имеющих указанные разрешения.

  • Число итераций по умолчанию для хэшера паролей PBKDF2 увеличено со 150 000 до 180 000.

django.contrib.gis

  • Разрешено функциям пространственного поиска MySQL работать с реальной геометрией. Предыдущая поддержка ограничивалась ограничивающими рамками.

  • Добавлена ​​функция GeometryDistance, поддерживаемая в PostGIS.

  • Добавлена ​​поддержка единицы измерения «фарлонг» в Distance.

  • Параметр GEOIP_PATH теперь поддерживает pathlib.Path.

  • Класс GeoIP2 теперь принимает pathlib.Path path.

django.contrib.postgres

  • Новый RangeOperators помогает избежать опечаток в операторах SQL, которые можно использовать вместе с RangeField.

  • Новое выражение RangeBoundary представляет границы диапазона.

  • Новые классы AddIndexConcurrently и RemoveIndexConcurrently позволяют создавать и удалять индексы CONCURRENTLY в PostgreSQL.

django.contrib.sessions

  • Новый метод get_session_cookie_age() позволяет динамически указывать возраст cookie сеанса.

django.contrib.syndicate

  • В django.contrib.syndiction.views.Feed добавлен атрибут класса language для настройки языка ленты. Значение по умолчанию — get_language() вместо LANGUAGE_CODE.

Кэш

Хранение файлов

  • Новый метод Storage.get_alternative_name() позволяет настроить алгоритм генерации имен файлов, если файл с загруженным именем уже существует.

Формы

  • Наборы форм могут управлять виджетом, используемым при упорядочивании форм через can_order, устанавливая атрибут ordering_widget или переопределяя get_ordering_widget().

Интернационализация

  • Добавлены настройки LANGUAGE_COOKIE_HTTPONLY, LANGUAGE_COOKIE_SAMESITE и LANGUAGE_COOKIE_SECURE для установки флагов HttpOnly, SameSite и Secure для языковых файлов cookie. Значения этих параметров по умолчанию сохраняют предыдущее поведение.

  • Добавлена ​​поддержка и переводы на узбекский язык.

Ведение журнала

  • Новый параметр reporter_class в AdminEmailHandler позволяет предоставить подкласс django.views.debug.ExceptionReporter для настройки текста трассировки, отправляемого на сайт ADMINS, когда DEBUG имеет значение False.

Команды управления

  • Новая опция compilemessages --ignore позволяет игнорировать определенные каталоги при поиске файлов .po для компиляции.

  • showmigrations --list теперь показывает примененные даты и время, если --verbosity равен 2 и выше.

  • В PostgreSQL dbshell теперь поддерживает сертификаты TLS на стороне клиента.

  • inspectdb теперь анализирует OneToOneField, когда внешний ключ имеет ограничение уникальности или первичного ключа.

  • Новая опция --skip-checks пропускает проверку системы перед запуском команды.

  • Параметры startapp --template и startproject --template теперь поддерживают шаблоны, хранящиеся в архивах XZ (.tar.xz, .txz) и архивах LZMA (.tar.lzma, .tlz).

Модели

  • Добавлены функции хеш-базы данных MD5, SHA1, SHA224, SHA256, SHA384 и SHA512.

  • Добавлена ​​функция базы данных Sign.

  • Новый параметр is_dst функций базы данных Trunc определяет обработку несуществующих и неоднозначных дат и времени.

  • connection.queries теперь показывает операторы COPY… TO в PostgreSQL.

  • FilePathField теперь принимает вызов для path.

  • Разрешена симметричная промежуточная таблица для самоссылающихся ManyToManyField.

  • Атрибуты name CheckConstraint, UniqueConstraint и Index теперь поддерживают интерполяцию меток приложения и классов с использованием заполнителей '%(app_label)s' и '%(class)s'.

  • Новый атрибут Field.descriptor_class позволяет полям модели настраивать поведение получения и установки, переопределяя их дескрипторы.

  • Avg и Sum теперь поддерживают аргумент distinct.

  • Добавлен SmallAutoField, который действует очень похоже на AutoField, за исключением того, что он допускает значения только ниже определенного (зависящего от базы данных) предела. Значения от «1» до «32767» безопасны во всех базах данных, поддерживаемых Django.

  • AutoField, BigAutoField и SmallAutoField теперь наследуются от IntegerField, BigIntegerField и SmallIntegerField соответственно. Системные проверки и валидаторы теперь также правильно наследуются.

  • FileField.upload_to теперь поддерживает pathlib.Path.

  • CheckConstraint теперь поддерживается в MySQL 8.0.16+.

  • Новый методallows_group_by_selected_pks_on_model()`` django.db.backends.base.BaseDatabaseFeatures`` позволяет оптимизировать предложения GROUP BY, чтобы требовать только первичные ключи выбранных моделей. По умолчанию он поддерживается только для управляемых моделей PostgreSQL.

    Чтобы включить оптимизацию GROUP BY только по первичному ключу для неуправляемых моделей, вам необходимо создать подкласс ядра базы данных PostgreSQL, переопределив метод класса функцийallows_group_by_selected_pks_on_model() по мере необходимости. Пример см. в разделе Подклассификация встроенных баз данных.

Запросы и ответы

  • Разрешено инициализировать HttpResponse содержимым memoryview.

  • Для использования, например, в шаблонах Django, HttpRequest.headers теперь позволяет осуществлять поиск с использованием символов подчеркивания (например, user_agent) вместо дефисов.

Безопасность

  • X_FRAME_OPTIONS теперь по умолчанию имеет значение 'DENY'. В более старых версиях параметр X_FRAME_OPTIONS по умолчанию имеет значение 'SAMEORIGIN'. Если ваш сайт использует сами фреймы, вам нужно будет явно установить X_FRAME_OPTIONS = „SAMEORIGIN“`, чтобы они продолжали работать.

  • SECURE_CONTENT_TYPE_NOSNIFF теперь по умолчанию имеет значение True. Если это включено, SecurityMiddleware устанавливает заголовок X-Content-Type-Options: nosniff для всех ответов, в которых его еще нет.

  • SecurityMiddleware теперь может отправлять заголовок Referrer-Policy.

Тесты

  • Новый аргумент теста Client``raise_request_Exception` позволяет контролировать, должны ли исключения, возникающие во время запроса, также вызываться в тесте. Значение по умолчанию равно True для обратной совместимости. Если это значение «False» и возникает исключение, тестовый клиент вернет ответ 500 с атрибутом exc_info, кортеж, предоставляющий информацию о произошедшем исключении.

  • Тесты и тестовые примеры для запуска можно выбирать по шаблону имени теста, используя новую опцию test -k.

  • Сравнение HTML, используемое assertHTMLEqual(), теперь рассматривает текст, ссылки на символы и ссылки на сущности, которые ссылаются на один и тот же символ, как эквивалентные.

  • DiscoverRunner теперь может запускать отладчик при каждой ошибке или сбое, используя опцию test --pdb.

Обратная несовместимость изменений в версии 3.0

Model.save() при указании значения по умолчанию для первичного ключа

Model.save() больше не пытается найти строку при сохранении нового экземпляра Model и предоставляется значение по умолчанию для первичного ключа, и всегда выполняет одиночный запрос INSERT. В старых версиях Django Model.save() выполнял либо INSERT, либо UPDATE в зависимости от того, существует строка или нет.

Это делает вызов Model.save() с предоставлением значения первичного ключа по умолчанию эквивалентным передаче force_insert=True в save() модели. Попытки использовать новый экземпляр Model для обновления существующей строки приведут к ошибке IntegrityError.

Чтобы обновить существующую модель для определенного значения первичного ключа, используйте вместо этого метод update_or_create() или QuerySet.filter(pk=…).update(…). Например:

>>> MyModel.objects.update_or_create(pk=existing_pk, defaults={"name": "new name"})
>>> MyModel.objects.filter(pk=existing_pk).update(name="new name")

Серверный API базы данных

В этом разделе описаны изменения, которые могут потребоваться в сторонних базах данных.

  • Вторым аргументом DatabaseIntrospection.get_geometry_type() теперь является описание строки, а не имя столбца.

  • DatabaseIntrospection.get_field_type() больше не может возвращать кортежи.

  • Если база данных может создавать внешние ключи в том же операторе SQL, который добавляет поле, добавьте SchemaEditor.sql_create_column_inline_fk с соответствующим SQL; в противном случае установите DatabaseFeatures.can_create_inline_fk = False.

  • DatabaseFeatures.can_return_id_from_insert и can_return_ids_from_bulk_insert переименованы в can_return_columns_from_insert и can_return_rows_from_bulk_insert.

  • Функции базы данных теперь обрабатывают форматы datetime.timezone при создании с использованием экземпляров datetime.timedelta (например, timezone(timedelta(hours=5)), который будет выводить 'UTC+05:00'). Сторонние серверные программы должны обрабатывать этот формат при подготовке DateTimeField в datetime_cast_date_sql(), datetime_extract_sql() и т. д.

  • Записи для AutoField, BigAutoField и SmallAutoField добавляются в DatabaseOperations.integer_field_ranges для поддержки валидаторов целочисленного диапазона для этих типов полей. Сторонним бэкэндам может потребоваться настроить записи по умолчанию.

  • DatabaseOperations.fetch_returned_insert_id() заменяется на fetch_returned_insert_columns(), который возвращает список значений, возвращаемых оператором INSERT… RETURNING, вместо одного значения.

  • DatabaseOperations.return_insert_id() заменяется на return_insert_columns(), который принимает аргумент fields, который представляет собой итерацию полей, возвращаемых после вставки. Обычно это только автоматически сгенерированный первичный ключ.

django.contrib.admin

  • Сообщения об изменении истории модели администратора теперь предпочитают более читаемые метки полей вместо имен полей.

django.contrib.gis

  • Поддержка PostGIS 2.1 удалена.

  • Поддержка SpatiaLite 4.1 и 4.2 удалена.

  • Поддержка GDAL 1.11 и GEOS 3.4 удалена.

Прекращена поддержка PostgreSQL 9.4.

Поддержка исходной версии PostgreSQL 9.4 заканчивается в декабре 2019 года. Django 3.0 поддерживает PostgreSQL 9.5 и выше.

Прекращена поддержка Oracle 12.1.

Восходящая поддержка Oracle 12.1 заканчивается в июле 2021 года. Django 2.2 будет поддерживаться до апреля 2022 года. Django 3.0 официально поддерживает Oracle 12.2 и 18c.

Удалены частные API совместимости с Python 2.

Хотя поддержка Python 2 была удалена в Django 2.0, некоторые частные API не были удалены из Django, чтобы сторонние приложения могли продолжать использовать их до окончания поддержки Python 2.

Поскольку мы ожидаем, что приложения потеряют совместимость с Python 2 при добавлении поддержки Django 3.0, в настоящее время мы удаляем эти API.

  • django.test.utils.str_prefix() — строки не имеют префикса „u“ в Python 3.

  • django.test.utils.patch_logger() — вместо этого используйте unittest.TestCase.assertLogs().

  • django.utils.lru_cache.lru_cache() — псевдоним functools.lru_cache().

  • django.utils.decorators.available_attrs() — эта функция возвращает functools.WRAPPER_ASSIGNMENTS.

  • django.utils.decorators.ContextDecorator — псевдоним contextlib.ContextDecorator.

  • django.utils._os.abspathu() — псевдоним os.path.abspath().

  • django.utils._os.upath() и npath() — эти функции ничего не делают в Python 3.

  • django.utils.six — удалите использование этой встроенной библиотеки или переключитесь на six.

  • django.utils.encoding.python_2_unicode_совместимый() — псевдоним six.python_2_unicode_совместимый().

  • django.utils.functional.curry() — используйте functools.partial() или functools.partialmethod. См. 5b1c389603a353625ae1603ba345147356336afb.

  • django.utils.safestring.SafeBytes — не используется с Django 2.0.

Новое значение по умолчанию для параметра FILE_UPLOAD_PERMISSIONS.

В более старых версиях для параметра FILE_UPLOAD_PERMISSIONS по умолчанию установлено значение None. При настройке по умолчанию:FILE_UPLOAD_HANDLERS это приводит к тому, что загруженные файлы имеют разные разрешения в зависимости от их размера и используемого обработчика загрузки.

FILE_UPLOAD_PERMISSIONS теперь по умолчанию имеет значение 0o644, чтобы избежать этого несоответствия.

Новые значения по умолчанию для настроек безопасности

Чтобы сделать проекты Django более безопасными по умолчанию, некоторые настройки безопасности теперь имеют более безопасные значения по умолчанию:

См. Что нового Раздел безопасности выше для получения более подробной информации об этих изменениях.

Разнообразный

  • ContentType.__str__() теперь включает app_label модели для устранения неоднозначности моделей с одинаковым именем в разных приложениях.

  • Поскольку доступ к языку в сеансе, а не в файле cookie, устарел, LocaleMiddleware больше не ищет язык пользователя в сеансе, а django.contrib.auth.logout() больше не сохраняет язык сеанса после выхода из системы.

  • django.utils.html.escape() теперь использует html.escape() для экранирования HTML. Это преобразует ' в ' вместо предыдущего эквивалентного десятичного кода '.

  • Опция django-admin test -k теперь работает как опция unittest -k, а не как ярлык для --keepdb.

  • Поддержка pywatchman < 1.2.0 удалена.

  • urlencode() теперь кодирует повторяемые значения такими, какие они есть при doseq=False, вместо того, чтобы повторять их, приводя их в соответствие с функцией стандартной библиотеки urllib.parse.urlencode().

  • Фильтр шаблонов intword теперь переводит 1.0 как фразу в единственном числе, а все остальные числовые значения - как во множественном числе. Это может быть неправильно для некоторых языков.

  • Присвоение значения атрибуту ForeignKey или OneToOneField '_id' модели теперь сбрасывает значение соответствующего поля. Последующий доступ к полю приведет к запросу.

  • patch_vary_headers() теперь обрабатывает звездочку '*' в соответствии с RFC 7231 Section 7.1.4, т.е. если список имен полей заголовка содержит звездочку, то заголовок Vary будет состоять из одной звездочки '*'.

  • В MySQL 8.0.16+ PositiveIntegerField и PositiveSmallIntegerField теперь включают проверочное ограничение для предотвращения отрицательных значений в базе данных.

  • alias=None добавляется к подписи Expression.get_group_by_cols().

  • RegexPattern, используемый re_path(), больше не возвращает аргументы ключевого слова со значениями None, которые должны быть переданы в представление для отсутствующих необязательных именованных групп.

Функции, устаревшие в версии 3.0

django.utils.encoding.force_text() и smart_text()

Псевдонимы smart_text() и force_text() (начиная с Django 2.0) smart_str() и force_str() устарели. Игнорируйте это устаревание, если ваш код поддерживает Python 2, поскольку поведение smart_str() и force_str() там отличается.

Разнообразный

  • django.utils.http.urlquote(), urlquote_plus(), urlunquote() и urlunquote_plus() устарели в пользу функций, псевдонимами которых они являются: urllib.parse.quote(), quote_plus(), unquote() и unquote_plus().

  • django.utils.translation.ugettext(), ugettext_lazy(), ugettext_noop(), ungettext() и ungettext_lazy() устарели в пользу функций, для которых они являются псевдонимами: django.utils.translation.gettext(), gettext_lazy(), gettext_noop(), ngettext() и ngettext_lazy().

  • Чтобы ограничить создание сеансов и, следовательно, отдать предпочтение некоторым стратегиям кэширования, django.views.i18n.set_language() прекратит установку языка пользователя в сеансе в Django 4.0. Начиная с Django 2.1, язык всегда хранится в файле cookie LANGUAGE_COOKIE_NAME.

  • django.utils.text.unescape_entities() устарел в пользу html.unescape(). Обратите внимание, что в отличие от unescape_entities(), html.unescape() немедленно оценивает ленивые строки.

  • Чтобы избежать возможной путаницы в отношении эффективной области действия, частная внутренняя утилита is_safe_url() переименована в url_has_allowed_host_and_scheme(). То, что URL-адрес имеет разрешенный хост и схему, в целом не означает, что он «безопасен». Например, оно может быть цитировано неправильно. Обязательно используйте iri_to_uri() в компоненте пути ненадежных URL-адресов.

Функции удалены в версии 3.0

Эти функции достигли конца цикла устаревания и удалены в Django 3.0.

См. Функции, устаревшие в версии 2.0 для получения подробной информации об этих изменениях, в том числе о том, как прекратить использование этих функций.

  • Модуль django.db.backends.postgresql_psycopg2 удален.

  • django.shortcuts.render_to_response() удален.

  • Параметр DEFAULT_CONTENT_TYPE удален.

  • HttpRequest.xreadlines() удален.

  • Поддержка аргумента context для Field.from_db_value() и Expression.convert_value() удалена.

  • Аргумент ключевого слова field_name для QuerySet.earliest() и latest() удален.

См. Функции, устаревшие в версии 2.1 для получения подробной информации об этих изменениях, в том числе о том, как прекратить использование этих функций.

  • ГИС-функция ForceRHR удалена.

  • django.utils.http.cookie_date() удален.

  • Библиотеки тегов шаблонов staticfiles и admin_static удалены.

  • django.contrib.staticfiles.templatetags.staticfiles.static() удален.

Back to Top