Примечания к выпуску Django 3.2¶
6 апреля 2021 г.
Добро пожаловать в Джанго 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 и 3.10 (начиная с версии 3.2.9). Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Что нового в Джанго 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. Начиная с версии 3.2, новые проекты генерируются с параметром DEFAULT_AUTO_FIELD, установленным в 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.
При изменении значения DEFAULT_AUTO_FIELD миграция для первичного ключа существующих автоматически созданных таблиц в настоящее время не может быть сгенерирована. Подробную информацию о переносе таких таблиц смотрите в документации 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¶
Новый аргумент
absolute_maxдляgeneric_inlineformset_factory()позволяет настроить максимальное количество форм, экземпляры которых могут быть созданы при предоставлении данныхPOST. Дополнительную информацию см. в Ограничение максимального количества экземпляров форм.Новый аргумент
can_delete_extraдляgeneric_inlineformset_factory()позволяет удалить опцию удаления дополнительных форм. См.can_delete_extraдля получения дополнительной информации.
django.contrib.gis¶
Метод
GDALRaster.transform()теперь поддерживаетSpatialReference.Класс
DataSourceтеперь поддерживаетpathlib.Path.Класс
LayerMappingтеперь поддерживаетpathlib.Path.
django.contrib.postgres¶
Новый атрибут
ExclusionConstraint.includeпозволяет создавать покрывающие ограничения исключения в PostgreSQL 12+.Новый атрибут ExclusionConstraint.opclasses позволяет устанавливать классы операторов PostgreSQL.
Новый атрибут
JSONBAgg.orderingопределяет порядок агрегированных элементов.Новый атрибут
JSONBAgg.distinctопределяет, будут ли агрегированные значения различны.Операция
CreateExtensionтеперь проверяет, что расширение уже существует в базе данных, и пропускает миграцию, если это так.Новые операции
CreateCollationиRemoveCollationпозволяют создавать и удалять параметры сортировки в PostgreSQL. Дополнительную информацию см. в разделе Управление параметрами сортировки с помощью миграций.Поиск по
ArrayFieldтеперь позволяет использовать (невложенные) массивы, содержащие выражения в правой части.Новое выражение
OpClass()позволяет создавать функциональные индексы для выражений с помощью специального класса операторов. Дополнительную информацию см. в Функциональные индексы.
django.contrib.sitemaps¶
Новые атрибуты
Sitemapalternates,languagesиx_defaultпозволяют создавать карту сайта. альтернативно локализованным версиям ваших страниц.
Серверные базы данных¶
Сторонние базы данных теперь могут пропускать или отмечать тесты с ожидаемыми ошибками в наборе тестов Django, используя новые атрибуты DatabaseFeatures.django_test_skips и django_test_expected_failures.
Декораторы¶
Новый декоратор
no_append_slash()позволяет исключать отдельные представления изAPPEND_SLASHнормализации URL-адресов.
Отчеты об ошибках¶
Пользовательские подклассы
ExceptionReporterтеперь могут определять свойстваhtml_template_pathиtext_template_pathдля переопределения шаблонов, используемых для отображения отчетов об исключениях.
Загрузка файлов¶
Новый обратный вызов
FileUploadHandler.upload_interrupted()позволяет обрабатывать прерванные загрузки.
Формы¶
Новый аргумент absolute_max для
formset_factory(),inlineformset_factory()иmodelformset_factory()позволяет настроить максимальное количество форм, экземпляры которых могут быть созданы при передаче данныхPOST. Дополнительную информацию см. в Ограничение максимального количества экземпляров форм.Новый аргумент
can_delete_extraдляformset_factory(),inlineformset_factory()иmodelformset_factory()позволяет удалить опцию удаления дополнительных форм. См.can_delete_extraдля получения дополнительной информации.BaseFormSetтеперь сообщает об ошибке, с которой столкнулся пользователь, а не вызывает исключение, когда форма управления отсутствует или была изменена. Чтобы настроить это сообщение об ошибке, передайте аргумент error_messages с ключом Missing_management_form при создании экземпляра набора форм.
Общие представления¶
Атрибуты
week_formatWeekMixinи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 для
QuerySet.select_for_update(), поддерживаемый в PostgreSQL, позволяет получать более слабые блокировки, которые не блокируют создание строк, ссылающихся на заблокированные строки через внешний ключ.Выражение
When()теперь позволяет использовать аргументconditionспоисками.Новые атрибуты
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на основе типа предоставленного имзначениядля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_nameQuerySet.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()позволяет генерировать диапазон страниц с исключенными некоторыми значениями. Если страниц много, это может быть полезно для создания разумного количества ссылок на страницы в шаблоне.
Запросы и ответы¶
Заголовки ответов теперь хранятся в
HttpResponse.headers. Его можно использовать вместо исходного dict-подобного интерфейса объектов HttpResponse. Оба интерфейса будут продолжать поддерживаться. Подробности смотрите в разделе Установка заголовков.Новый параметр
headersдляHttpResponse,SimpleTemplateResponseиTemplateResponseпозволяет устанавливать ответheadersпри создании экземпляра.
Безопасность¶
Допустимое значение параметра
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().
Сериализация¶
Сигналы¶
Signal.send_robust()теперь регистрирует исключения.
Шаблоны¶
Фильтр шаблонов
floatformatтеперь позволяет использовать суффиксgдля принудительной группировки поTHOUSAND_SEPARATORдля активной локали.Шаблоны, кэшированные с помощью Кэшированных загрузчиков шаблонов, теперь корректно перезагружаются в процессе разработки.
Тесты¶
Объекты, присвоенные атрибутам класса в
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.
Утилиты¶
Новый параметр глубины функций django.utils.timesince.timesince() и django.utils.timesince.timeuntil() позволяет указать количество возвращаемых соседних единиц времени.
Валидаторы¶
Встроенные валидаторы теперь включают указанное значение в аргумент params возникшего
ValidationError. Это позволяет пользовательским сообщениям об ошибках использовать заполнитель%(value)s.Оператор равенства
ValidationErrorтеперь игнорирует порядокmessagesиparams.
Изменения обратной несовместимости в версии 3.2¶
Серверный API базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в сторонних базах данных.
Новое свойство DatabaseFeatures.introspected_field_types заменяет эти функции:
can_introspect_autofieldcan_introspect_big_integer_fieldcan_introspect_binary_fieldcan_introspect_decimal_fieldcan_introspect_duration_fieldcan_introspect_ip_address_fieldcan_introspect_positive_integer_fieldcan_introspect_small_integer_fieldcan_introspect_time_fieldintrospected_big_auto_field_typeintrospected_small_auto_field_typeintrospected_boolean_field_type
Чтобы включить поддержку покрытия индексов (
Index.include) и покрытия уникальных ограничений (UniqueConstraint.include), установите дляDatabaseFeatures.supports_covering_indexesзначениеTrue.Сторонние базы данных должны реализовать поддержку сортировки базы данных столбцов для
CharFields иTextFields или установить дляDatabaseFeatures.supports_collation_on_charfieldиDatabaseFeatures.supports_collation_on_textfieldзначение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, отключив всеобъемлющее представление. См. Что нового в Джанго 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, такие как модуль
zoneinfoPython 3.9+ и его резервный порт.Недокументированный метод SpatiaLiteOperations.proj4_version() переименован в proj_version().
slugify()теперь удаляет начальные и конечные тире и подчеркивания.Фильтры шаблонов
intcommaиintwordбольше не зависят от настройкиUSE_L10N.Поддержка
argon2-cffi< 19.1.0 удалена.Ключи кэша больше не включают язык, когда интернационализация отключена (
USE_I18N = False) и включена локализация (USE_L10N = True). После обновления до Django 3.2 в таких конфигурациях первый запрос к любому ранее кэшированному значению будет промахом в кэше.ForeignKey.validate()теперь использует_base_managerвместо_default_managerдля проверки существования связанных экземпляров.Когда приложение определяет подкласс
AppConfigв подмодулеapps.py, Django теперь автоматически использует эту конфигурацию, даже если она не включена с помощьюdefault_app_config. Установитеdefault = Falseв подклассеAppConfig, если вам нужно предотвратить такое поведение. См. Что нового в Джанго 3.2 для более подробной информации.Создание экземпляра абстрактной модели теперь вызывает ошибку TypeError.
Аргументы ключевых слов для
setup_databases()теперь содержат только ключевые слова.Недокументированная функция django.utils.http.limited_parse_qsl() удалена. Вместо этого используйте
urllib.parse.parse_qsl().django.test.utils.TestContextDecoratorтеперь использует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_whitelistEmailValidatorустарели. Используйте «allowlist» вместо «whitelist» и «domain_allowlist» вместо «domain_whitelist». Возможно, вам придется переименовать «белый список» в существующих миграциях.Переменная конфигурации приложения
default_app_configустарела из-за автоматического обнаруженияAppConfig. См. Что нового в Джанго 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 4.1.