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

6 апреля 2021 г.

Добро пожаловать в Django 3.2!

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

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

Django 3.2 обозначен как выпуск с долгосрочной поддержкой . Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущего LTS, Django 2.2, прекратится в апреле 2022 года.

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

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

Что нового в Django 3.2

Автоматическое AppConfig обнаружение

Большинство подключаемых приложений определяют AppConfig подкласс в apps.py подмодуле. Многие определяют default_app_config переменную, указывающую на этот класс, в своих файлах __init__.py.

Когда apps.py подмодуль существует и определяет единственный AppConfig подкласс, Django теперь автоматически использует эту конфигурацию, поэтому вы можете удалить его default_app_config.

default_app_config сделало возможным объявить только путь приложения в INSTALLED_APPS (например 'django.contrib.admin' ), а не путь конфигурации приложения (например 'django.contrib.admin.apps.AdminConfig' ). Он был введен для обратной совместимости с первым стилем с намерением переключить экосистему на второй, но переключения не произошло.

С автоматическим AppConfig обнаружением default_app_config больше не требуется. Как следствие, он устарел.

См. Подробную информацию в разделе « Настройка приложений» .

Настройка типа автоматически создаваемых первичных ключей

При определении модели, если в модели не определено поле с primary_key=True неявным первичным ключом, добавляется. Типом этого неявного первичного ключа теперь можно управлять с помощью DEFAULT_AUTO_FIELD параметра и AppConfig.default_auto_field атрибута. Больше не нужно переопределять первичные ключи во всех моделях.

Сохраняя историческое поведение, значение по умолчанию DEFAULT_AUTO_FIELD - AutoField . Начиная с DEFAULT_AUTO_FIELD версии 3.2 новые проекты создаются со значением BigAutoField . Кроме того, новые приложения создаются со AppConfig.default_auto_field значением BigAutoField . В будущем выпуске Django значение по умолчанию DEFAULT_AUTO_FIELD будет изменено на BigAutoField .

Чтобы избежать нежелательных миграции в будущем, либо в явном виде установить DEFAULT_AUTO_FIELD на AutoField :

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

или настройте его для каждого приложения:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.AutoField'
    name = 'my_app'

или для каждой модели:

from django.db import models

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)

В ожидании изменения значения по умолчанию при проверке системы будет выдано предупреждение, если у вас нет явной настройки для DEFAULT_AUTO_FIELD .

Функциональные показатели

Новый *expressions позиционный аргумент Index() позволяет создавать функциональные индексы для выражений и функций базы данных. Например:

from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper


class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    height = models.IntegerField()
    weight = models.IntegerField()

    class Meta:
        indexes = [
            Index(
                Lower('first_name'),
                Upper('last_name').desc(),
                name='first_last_name_idx',
            ),
            Index(
                F('height') / (F('weight') + Value(5)),
                name='calc_idx',
            ),
        ]

Функциональные индексы добавляются к моделям с помощью Meta.indexes опции.

pymemcache поддержка

Новый django.core.cache.backends.memcached.PyMemcacheCache бэкэнд кеширования позволяет использовать библиотеку pymemcache для memcached. pymemcache Требуется 3.4.0 или выше. Подробнее см. Документацию по кешированию в Django .

Новые декораторы для админки

Новый display() декоратор позволяет легко добавлять параметры к пользовательским функциям отображения, которые можно использовать с list_display или readonly_fields .

Точно так же новый action() декоратор позволяет легко добавлять параметры к функциям действий, которые можно использовать с actions .

Использование @display декоратора имеет то преимущество, что теперь можно использовать @property декоратор, когда необходимо указать атрибуты в настраиваемом методе. До этого необходимо было использовать property() функцию после присвоения методу необходимых атрибутов.

Преимущество использования декораторов состоит в том, что эти параметры легче обнаружить, поскольку они могут быть предложены утилитами завершения в редакторах кода. Они просто удобны и по-прежнему устанавливают те же атрибуты для внутренних функций.

Незначительные особенности

django.contrib.admin

  • ModelAdmin.search_fields теперь позволяет искать по фразам в кавычках с пробелами.

  • Поля, связанные только для чтения, теперь отображаются как ссылки для навигации, если целевые модели зарегистрированы в админке.

  • Администратор теперь поддерживает темы и включает темную тему, которая включается в соответствии с настройками браузера. См. Дополнительную информацию в разделе « Поддержка тем».

  • ModelAdmin.autocomplete_fields теперь уважает ForeignKey.to_field и ForeignKey.limit_choices_to при поиске родственной модели.

  • Теперь администратор устанавливает окончательное комплексное представление, которое перенаправляет неаутентифицированных пользователей на страницу входа в систему, независимо от того, действителен ли URL-адрес в противном случае. Это защищает от потенциальной проблемы конфиденциальности перечисления моделей.

    Хотя это не рекомендуется, вы можете установить новое AdminSite.final_catch_all_view значение, False чтобы отключить всеобъемлющий просмотр.

django.contrib.auth

  • Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено с 216 000 до 260 000.

  • Вариант по умолчанию для хешера паролей Argon2 изменен на Argon2id. memory_cost и parallelism увеличиваются до 102 400 и 8 соответственно, чтобы соответствовать argon2-cffi значениям по умолчанию.

    Увеличение memory_cost объема требуемой памяти сдвигает с 512 КБ до 100 МБ. Это все еще довольно консервативно, но может привести к проблемам в средах с ограниченным объемом памяти. В этом случае существующий хешер можно разделить на подклассы, чтобы переопределить значения по умолчанию.

  • Энтропия соли по умолчанию для хешеров паролей Argon2, MD5, PBKDF2, SHA-1 увеличена с 71 до 128 бит.

django.contrib.contenttypes

django.contrib.gis

django.contrib.postgres

  • Новый ExclusionConstraint.include атрибут позволяет создавать закрывающие ограничения исключения в PostgreSQL 12+.
  • Новый ExclusionConstraint.opclasses атрибут позволяет задавать классы операторов PostgreSQL.
  • Новый JSONBAgg.ordering атрибут определяет порядок агрегированных элементов.
  • Новый JSONBAgg.distinct атрибут определяет, будут ли агрегированные значения отличаться друг от друга.
  • Теперь CreateExtension операция проверяет, что расширение уже существует в базе данных, и пропускает миграцию, если это так.
  • Новые CreateCollation и RemoveCollation операции позволяют создавать и сбросив на PostgreSQL сортировки. Дополнительные сведения см. В разделе « Управление сопоставлениями с помощью миграции» .
  • Поиск на ArrayField данный момент разрешает ( невложенные ) массивы, содержащие выражения в качестве правых частей.
  • Новое OpClass() выражение позволяет создавать функциональные индексы для выражений с пользовательским классом операторов. См. Функциональные индексы для более подробной информации.

django.contrib.sitemaps

  • Новые Sitemap атрибуты alternates , languages и x_default позволяет генерировать карту сайта чередуется локализованные версии ваших страниц.

django.contrib.syndication

  • Новый item_comments хук позволяет указывать URL комментариев для каждого элемента фида.

Бэкэнды базы данных

  • Сторонние серверные части баз данных теперь могут пропускать или отмечать ожидаемые отказы в тестовом наборе Django с помощью атрибутов new DatabaseFeatures.django_test_skips и django_test_expected_failures.

Декораторы

  • Новый no_append_slash() декоратор позволяет исключить отдельные представления из APPEND_SLASH нормализации URL.

Отчеты об ошибках

  • Пользовательские ExceptionReporter Теперь подклассы могут определять html_template_path и text_template_path свойство для переопределения шаблонов , используемых для визуализации отчетов исключений.

Загрузка файлов

Формы

Общие представления

  • Эти week_format атрибуты WeekMixin и WeekArchiveView теперь поддерживают '%V' недельный формат ISO 8601.

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

  • loaddata теперь поддерживает приборы, хранящиеся в архивах XZ ( .xz ) и архивах LZMA ( .lzma ).
  • dumpdata теперь может сжимать данные в bz2, gz, lzma или xz форматах.
  • makemigrations теперь можно вызывать без активного соединения с базой данных. В этом случае проверка последовательной истории миграции пропускается.
  • BaseCommand.requires_system_checks теперь поддерживает указание списка тегов. Системные проверки, зарегистрированные в выбранных тегах, будут проверены на наличие ошибок до выполнения команды. В предыдущих версиях либо все проверки системы, либо никакие не выполнялись.
  • Обновлена ​​поддержка цветного вывода терминала в Windows. Различные современные терминальные среды автоматически обнаруживаются, а возможности включения поддержки в других случаях улучшаются. См. Дополнительные сведения в разделе « Раскраска синтаксиса» .

Миграции

  • Новое Operation.migration_name_fragment свойство позволяет указать фрагмент имени файла, который будет использоваться для наименования миграции, содержащей только эту операцию.
  • Миграции теперь поддерживают сериализацию чистых и конкретных объектов пути из экземпляров pathlib и os.PathLike экземпляров.

Модели

  • Новый no_key параметр for QuerySet.select_for_update() , поддерживаемый в PostgreSQL, позволяет устанавливать более слабые блокировки, которые не блокируют создание строк, которые ссылаются на заблокированные строки через внешний ключ.
  • When() выражение теперь позволяет использовать condition аргумент с lookups.
  • Новые Index.include и UniqueConstraint.include атрибуты позволяют создавать покрытие индексов и охватывающие уникальные ограничения на PostgreSQL 11+.
  • Новый UniqueConstraint.opclasses атрибут позволяет задавать классы операторов PostgreSQL.
  • Теперь QuerySet.update() метод учитывает order_by() положения MySQL и MariaDB.
  • FilteredRelation() теперь поддерживает вложенные отношения.
  • of Аргумент QuerySet.select_for_update() теперь разрешено на MySQL 8.0.1+.
  • Value() Выражение теперь автоматически разрешает его output_field к соответствующему Field подклассу на основе типа ее при условии , value для bool , bytes , float , int , str , datetime.date , datetime.datetime , datetime.time , datetime.timedelta , decimal.Decimal , и uuid.UUID экземпляров. Как следствие, разрешение output_field для функций базы данных и комбинированных выражений теперь может аварийно завершить работу со смешанными типами при использовании Value(). В output_field таких случаях вам нужно будет явно указать .
  • Новый QuerySet.alias() метод позволяет создавать многоразовые псевдонимы для выражений, которые не нужно выбирать, но используются для фильтрации, упорядочивания или как часть сложных выражений.
  • Новая Collate функция позволяет фильтровать и упорядочивать по заданным параметрам сортировки базы данных.
  • field_name Аргумент QuerySet.in_bulk() теперь принимает различные поля , если есть только одно поле указано в QuerySet.distinct() .
  • Новый tzinfo параметр функций TruncDate и TruncTime базы данных позволяет обрезать дату и время в определенном часовом поясе.
  • Новый db_collation аргумент для CharField и TextField позволяет установить параметры сортировки базы данных для поля.
  • Добавлена Random функция базы данных.
  • Функции агрегирования ,F() , OuterRef() и другие выражения позволяют теперьпомощью преобразования. Подробнее см. Выражения могут ссылаться на преобразования .
  • Новый durable аргумент для atomic() гарантии того, что изменения, внесенные в атомарный блок, будут зафиксированы, если блок завершится без ошибок. Вложенный атомарный блок, помеченный как надежный, вызовет расширение RuntimeError.
  • Добавлена JSONObject функция базы данных.

Пагинация

  • Новый django.core.paginator.Paginator.get_elided_page_range() метод позволяет сгенерировать диапазон страниц без некоторых значений. Если существует большое количество страниц, это может быть полезно для создания разумного количества ссылок на страницы в шаблоне.

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

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

  • Параметр SECRET_KEY теперь проверяется на допустимое значение при первом доступе, а не при первой загрузке параметров. Это позволяет запускать команды управления, которые не зависят от, SECRET_KEY без необходимости указывать значение. Как следствие этого вызов configure() без предоставления действительного SECRET_KEY, а затем переход к доступу settings.SECRET_KEY теперь вызовет ImproperlyConfigured исключение.

  • Новые Signer.sign_object() и Signer.unsign_object() методы позволяют подписывать сложные структуры данных. Подробнее см. Защита сложных структур данных.

    Кроме того, signing.dumps() и loads() стали ярлыками для TimestampSigner.sign_object() и unsign_object() .

Сериализация

  • Новый сериализатор JSONL позволяет использовать формат JSON Lines с dumpdata и loaddata . Это может быть полезно для заполнения больших баз данных, потому что данные загружаются в память построчно, а не загружаются все сразу.

Сигналы

Шаблоны

Тесты

  • Объекты, назначенные атрибутам класса в TestCase.setUpTestData() , теперь изолированы для каждого метода тестирования. Такие объекты теперь требуются для поддержки создания глубоких копий с помощью copy.deepcopy() . Назначение неподдерживаемых объектов deepcopy() устарело и будет удалено в Django 4.1.
  • DiscoverRunner теперь faulthandler по умолчанию включен. Это можно отключить с помощью опции.test --no-faulthandler
  • DiscoverRunner а команда test управления теперь может отслеживать время, включая настройку базы данных и общее время выполнения. Это можно включить с помощью опции.test --timing
  • Client теперь сохраняет строку запроса при выполнении переадресации 307 и 308.
  • Новый TestCase.captureOnCommitCallbacks() метод фиксирует функции обратного вызова, передаваемые transaction.on_commit() в список. Это позволяет вам тестировать такие обратные вызовы, не используя более медленный TransactionTestCase .
  • TransactionTestCase.assertQuerysetEqual() теперь поддерживает прямое сравнение с другим набором запросов, а не ограничивается сравнением со списком строковых представлений объектов при использовании значения по умолчанию для transform аргумента.

Утилиты

  • Новый depth параметр django.utils.timesince.timesince() и django.utils.timesince.timeuntil() функций позволяет задать число смежных единиц времени , чтобы вернуться.

Валидаторы

  • Встроенные валидаторы теперь включают предоставленное значение в params аргумент поднятого ValidationError . Это позволяет настраиваемым сообщениям об ошибках использовать %(value)s заполнитель.
  • Оператор ValidationError равенства теперь игнорирует messages и params упорядочивает.

Обратно несовместимые изменения в 3.2

API серверной части базы данных

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

  • Новое DatabaseFeatures.introspected_field_types свойство заменяет эти функции:
    • can_introspect_autofield
    • can_introspect_big_integer_field
    • can_introspect_binary_field
    • can_introspect_decimal_field
    • can_introspect_duration_field
    • can_introspect_ip_address_field
    • can_introspect_positive_integer_field
    • can_introspect_small_integer_field
    • can_introspect_time_field
    • introspected_big_auto_field_type
    • introspected_small_auto_field_type
    • introspected_boolean_field_type
  • Чтобы включить поддержку для покрытия индексов ( Index.include ) и покрытия уникальных ограничений ( UniqueConstraint.include ), установите DatabaseFeatures.supports_covering_indexes значение True.
  • Сторонние серверные части баз данных должны реализовывать поддержку сортировки базы данных столбцов по CharField s и TextField s или set DatabaseFeatures.supports_collation_on_charfield and DatabaseFeatures.supports_collation_on_textfield to False. Если недетерминированные сопоставления не поддерживаются, установите supports_non_deterministic_collations значение False.
  • DatabaseOperations.random_function_sql() удален в пользу новой Random функции базы данных.
  • DatabaseOperations.date_trunc_sql() и DatabaseOperations.time_trunc_sql() теперь возьмите необязательный tzname аргумент для усечения в определенном часовом поясе.
  • DatabaseClient.runshell() теперь получает аргументы и необязательный словарь с переменными среды для основного клиента командной строки из DatabaseClient.settings_to_cmd_args_env() метода. Сторонние серверные части баз данных должны быть реализованы DatabaseClient.settings_to_cmd_args_env() или переопределены DatabaseClient.runshell().
  • Сторонние серверные части баз данных должны поддерживать функциональные индексы ( Index.expressions ) или иметь DatabaseFeatures.supports_expression_indexes значение False. Если COLLATE не является частью инструкции, установите значение .CREATE INDEX DatabaseFeatures.collate_as_index_expression True

django.contrib.admin

  • Ссылки пагинации в админке теперь индексируются 1 вместо 0, т.е. строка запроса для первой страницы ?p=1 вместо ?p=0.
  • Новое универсальное представление администратора нарушит шаблоны URL-адресов, маршрутизируемые после URL-адресов администратора и соответствующие префиксу URL-адреса администратора. Вы можете настроить порядок URL или, в случае необходимости, установить AdminSite.final_catch_all_view на False отключение приема всей точки зрения. Подробнее см. Что нового в Django 3.2 .
  • Минифицированные файлы JavaScript больше не включены в админку. Если вам необходимо минимизировать эти файлы, рассмотрите возможность использования стороннего приложения или внешнего инструмента сборки. Минифицированные поставляемые файлы JavaScript, упакованные с администратором (например, jquery.min.js ), по-прежнему включены.
  • ModelAdmin.prepopulated_fields больше не удаляет английские стоп-слова, такие как 'a' или 'an'.

django.contrib.gis

  • Поддержка PostGIS 2.2 удалена.
  • Серверная часть Oracle теперь клонирует полигоны (и коллекции геометрии, содержащие полигоны) перед их переориентацией и сохранением в базе данных. Они больше не видоизменяются. Вы можете заметить это, если используете многоугольники после сохранения модели.

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

Поддержка PostgreSQL 9.5 в апстриме заканчивается в феврале 2021 года. Django 3.2 поддерживает PostgreSQL 9.6 и выше.

Прекращена поддержка MySQL 5.6

Окончание восходящей поддержки MySQL 5.6 - апрель 2021 года. Django 3.2 поддерживает MySQL 5.7 и выше.

Разное

  • Django теперь поддерживает не- pytz часовые пояса, такие как zoneinfo модуль Python 3.9+ и его бэкпорт.

  • Недокументированный SpatiaLiteOperations.proj4_version() метод переименован в proj_version().

  • slugify() теперь удаляет начальные и конечные дефисы и подчеркивания.

  • Эти intcomma и intword фильтры шаблонов больше не зависит от USE_L10N настройки.

  • Поддержка argon2-cffi <19.1.0 удалена.

  • Ключи кеша больше не включают язык, когда интернационализация отключена ( ) и включена локализация ( ). После обновления до Django 3.2 в таких конфигурациях первым запросом на любое ранее закешированное значение будет промах в кеше.USE_I18N = False USE_L10N = True

  • ForeignKey.validate() теперь использует, _base_manager а не _default_manager проверяет наличие связанных экземпляров.

  • Когда приложение определяет AppConfig подкласс в apps.py подмодуле, Django теперь автоматически использует эту конфигурацию, даже если она не включена в default_app_config. Установите в подклассе, если вам нужно предотвратить такое поведение. Подробнее см. Что нового в Django 3.2 .default = False AppConfig

  • Теперь возникает необходимость создания абстрактной модели TypeError.

  • Аргументы setup_databases() ключевого слова для теперь содержат только ключевые слова.

  • Недокументированная django.utils.http.limited_parse_qsl() функция удалена. Пожалуйста, используйте urllib.parse.parse_qsl() вместо этого.

  • django.test.utils.TestContextDecorator now использует addCleanup() так, чтобы очистки, зарегистрированные в setUp() методе, вызывались раньше TestContextDecorator.disable().

  • SessionMiddleware теперь вызывает SessionInterrupted исключение, а не SuspiciousOperation когда сеанс уничтожается в параллельном запросе.

  • Оператор django.db.models.Field равенства теперь правильно различает унаследованные экземпляры полей в разных моделях. Кроме того, теперь определен порядок таких полей.

  • Недокументированная django.core.files.locks.lock() функция теперь возвращается, False если файл не может быть заблокирован, вместо повышения BlockingIOError .

  • Механизм сброса пароля теперь делает токены недействительными при изменении электронной почты пользователя.

  • makemessages Команда больше не обрабатывает недопустимые языковые стандарты, указанные с помощью параметра, если они содержат дефисы ( ).makemessages --locale '-'

  • Поле django.contrib.auth.forms.ReadOnlyPasswordHashField формы теперь disabled по умолчанию. Поэтому UserChangeForm.clean_password() больше не требуется возвращать начальное значение.

  • cache.get_many(), get_or_set(), has_key(), incr(), decr(), incr_version(), И decr_version() операции кэша теперь корректно ручка None хранится в кэше, таким же образом , как и любое другое значение, вместо того , чтобы вести себя так , как будто ключ не существует.

    Из-за python-memcached ограничения прежнее поведение для устаревшего MemcachedCache бэкэнда сохраняется .

  • Минимальная поддерживаемая версия SQLite увеличена с 3.8.3 до 3.9.0.

  • CookieStorage теперь хранит сообщения в Формат, соответствующий RFC 6265 . Поддержка файлов cookie, использующих старый формат, сохраняется до Django 4.1.

  • Минимальная поддерживаемая версия asgiref увеличена с 3.2.10 до 3.3.2.

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

Разное

  • Назначение объектов, которые не поддерживают создание глубоких копий с помощью copy.deepcopy() атрибутов класса TestCase.setUpTestData() , устарело.
  • Использование логического значения в BaseCommand.requires_system_checks устарело. Используйте '__all__' вместо True, и [] (пустой список) вместо False.
  • whitelist Аргумент и domain_whitelist атрибут EmailValidator устарели. Используйте allowlist вместо whitelist и domain_allowlist вместо domain_whitelist. Возможно, вам придется переименовать whitelist существующие миграции.
  • default_app_config Переменная конфигурация приложения устарела, из - за теперь автоматическое AppConfig открытие. Подробнее см. Что нового в Django 3.2 .
  • Автоматический вызов repr() набора запросов в TransactionTestCase.assertQuerysetEqual() по сравнению со строковыми значениями устарел. Если вам нужно предыдущее поведение, явно установите transform значение repr.
  • django.core.cache.backends.memcached.MemcachedCache Бэкенд нежелателен python-memcached имеют некоторые проблемы и , кажется, никто не поддерживались. Используйте django.core.cache.backends.memcached.PyMemcacheCache или django.core.cache.backends.memcached.PyLibMCCache вместо.
  • Формат сообщений, используемых django.contrib.messages.storage.cookie.CookieStorage в Django, отличается от формата, создаваемого более старыми версиями Django. Поддержка старого формата сохраняется до Django 4.1.

Copyright ©2021 All rights reserved