Примечания к выпуску Django 3.1¶
4 августа 2020 г.
Добро пожаловать в Джанго 3.1!
Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 3.0 или более ранней версии. Мы отменили некоторые функции, цикл устаревания которых достиг конца, и мы начали процесс прекращения поддержки некоторых функций.
См. руководство Upgrading Django to a newer version, если вы обновляете существующий проект.
Совместимость версий Python¶
Django 3.1 поддерживает Python 3.6, 3.7, 3.8 и 3.9 (начиная с версии 3.1.3). Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Что нового в Джанго 3.1¶
Асинхронные представления и поддержка промежуточного программного обеспечения¶
Django теперь поддерживает полностью асинхронный путь запроса, в том числе:
Чтобы начать работу с асинхронными представлениями, вам необходимо объявить представление, используя async def:
async def my_view(request):
await asyncio.sleep(0.5)
return HttpResponse('Hello, async world!')
Все асинхронные функции поддерживаются независимо от того, работаете ли вы в режиме WSGI или ASGI. Однако использование асинхронного кода в режиме WSGI приведет к снижению производительности. Подробнее об особенностях можно прочитать в документации Асинхронная поддержка.
Вы можете сколько угодно смешивать асинхронные и синхронизирующие представления, промежуточное программное обеспечение и тесты. Django гарантирует, что вы всегда получите правильный контекст выполнения. Мы ожидаем, что в большинстве проектов большая часть представлений будет синхронизирована, и лишь немногие избранные будут работать в асинхронном режиме, но это полностью ваш выбор.
ORM Django, уровень кэша и другие фрагменты кода, выполняющие длительные сетевые вызовы, пока не поддерживают асинхронный доступ. Мы планируем добавить их поддержку в следующих выпусках. Асинхронные представления идеальны, однако, если вы выполняете много вызовов API или HTTP внутри своего представления, теперь вы можете изначально выполнять все эти HTTP-вызовы параллельно, чтобы значительно ускорить выполнение вашего представления.
Асинхронная поддержка должна быть полностью обратно совместима, и мы постарались гарантировать, что она не будет иметь снижения скорости для существующего синхронного кода. Это не должно оказать заметного влияния на существующие проекты Django.
JSONField для всех поддерживаемых баз данных.¶
Django теперь включает models.JSONField и forms.JSONField, которые можно использовать во всех поддерживаемых базах данных. Оба поля поддерживают использование пользовательских кодировщиков и декодеров JSON. Поле модели поддерживает самоанализ, поиск и преобразование, которые ранее были доступны только для PostgreSQL:
from django.db import models
class ContactInfo(models.Model):
data = models.JSONField()
ContactInfo.objects.create(data={
'name': 'John',
'cities': ['London', 'Cambridge'],
'pets': {'dogs': ['Rufus', 'Meg']},
})
ContactInfo.objects.filter(
data__name='John',
data__pets__has_key='dogs',
data__cities__contains='London',
).delete()
Если ваш проект использует django.contrib.postgres.fields.JSONField, а также связанное поле формы и преобразования, вам следует настроить использование новых полей, а также сгенерировать и применить миграцию базы данных. На данный момент старые поля и преобразования оставлены как ссылки на новые и устарели с этой версии.
Настройки DEFAULT_HASHING_ALGORITHM¶
The new DEFAULT_HASHING_ALGORITHM transitional setting allows
specifying the default hashing algorithm to use for encoding cookies, password
reset tokens in the admin site, user sessions, and signatures created by
django.core.signing.Signer and django.core.signing.dumps().
Support for SHA-256 was added in Django 3.1. If you are upgrading multiple
instances of the same project to Django 3.1, you should set
DEFAULT_HASHING_ALGORITHM to 'sha1' during the transition, in
order to allow compatibility with the older versions of Django. Note that this
requires Django 3.1.1+. Once the transition to 3.1 is complete you can stop
overriding DEFAULT_HASHING_ALGORITHM.
Этот параметр устарел с этого выпуска, поскольку поддержка токенов, файлов cookie, сеансов и подписей, использующих алгоритм SHA-1, будет удалена в Django 4.0.
Минорные изменения¶
django.contrib.admin¶
Новый
django.contrib.admin.EmptyFieldListFilterдляModelAdmin.list_filterпозволяет фильтровать пустые значения (пустые строки и значения NULL) в представлении списка изменений администратора.Фильтры на правой боковой панели представления списка изменений администратора теперь содержат ссылку для очистки всех фильтров.
У администратора теперь есть боковая панель на больших экранах для упрощения навигации. Он включен по умолчанию, но его можно отключить, используя собственный AdminSite и установив для
AdminSite.enable_nav_sidebarзначениеFalse.Для рендеринга боковой панели требуется доступ к текущему запросу, чтобы установить возможности ролей CSS и ARIA. Для этого необходимо использовать
'django.template.context_processors.request'в опции'context_processors'вOPTIONS.Изначально пустые
лишниестроки теперь можно удалить так же, как и динамически создаваемые.XRegExpобновлен с версии 2.0.0 до 3.2.0.jQuery обновлен с версии 3.4.1 до 3.5.1.
Библиотека Select2 обновлена с версии 4.0.7 до 4.0.13.
django.contrib.auth¶
Число итераций по умолчанию для хэшера паролей PBKDF2 увеличено со 180 000 до 216 000.
Новый параметр
PASSWORD_RESET_TIMEOUTпозволяет определить количество секунд, в течение которых действительна ссылка для сброса пароля. Это рекомендуется вместо устаревшего параметра PASSWORD_RESET_TIMEOUT_DAYS, который будет удален в Django 4.0.Механизм сброса пароля теперь использует алгоритм хеширования SHA-256. Поддержка токенов, использующих старый алгоритм хеширования, сохраняется до Django 4.0.
AbstractBaseUser.get_session_auth_hash()теперь использует алгоритм хеширования SHA-256. Поддержка пользовательских сессий, использующих старый алгоритм хеширования, сохраняется до Django 4.0.
django.contrib.contenttypes¶
Новая опция
remove_stale_contenttypes --include-stale-appsпозволяет удалять устаревшие типы контента из ранее установленных приложений, которые были удалены изINSTALLED_APPS.
django.contrib.gis¶
django.contrib.humanize¶
intwordФильтр шаблонов теперь поддерживает отрицательные целые числа.
django.contrib.postgres¶
Новый класс
BloomIndexпозволяет создавать индексыbloomв базе данных. Новая операция миграцииBloomExtensionустанавливает расширениеbloomдля добавления поддержки этого индекса.get_FOO_display()теперь поддерживаетArrayFieldиRangeField.Новые запросы
rangefield.lower_inc,rangefield.lower_inf,rangefield.upper_incиrangefield.upper_infпозволяют выполнять запросы кRangeFieldпо связанному типу.rangefield.contained_byтеперь поддерживаетSmallAutoField,AutoField,BigAutoField,SmallIntegerField, иDecimalField.SearchQueryтеперь поддерживает тип поиска'websearch'в PostgreSQL 11+.SearchQuery.valueтеперь поддерживает выражения запроса.Новый класс
SearchHeadlineпозволяет выделять результаты поиска.searchпоиск теперь поддерживает выражения запроса.Новый параметр Cover_density в :class:`~django.contrib.postgres.search.SearchRank позволяет ранжировать по плотности покрытия.
Новый параметр нормализации
SearchRankпозволяет нормализовать ранг.Новый атрибут
ExclusionConstraint.deferrableпозволяет создавать отложенные ограничения исключения.
django.contrib.sessions¶
Параметр
SESSION_COOKIE_SAMESITEтеперь позволяет значению ``“None“` (строковое) явно указывать, что файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
django.contrib.staticfiles¶
Параметр
STATICFILES_DIRSтеперь поддерживаетpathlib.Path.
Кэш¶
Декоратор
cache_control()и методpatch_cache_control()теперь поддерживают несколько имен полей в директивеno-cacheдля заголовкаCache-Control, согласно RFC 7234 Section 5.2.2.2.delete()now returnsTrueif the key was successfully deleted,Falseotherwise.
CSRF¶
Параметр
CSRF_COOKIE_SAMESITEтеперь позволяет значению'None'(строковое) явно указывать, что файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
Электронная почта¶
Параметр
EMAIL_FILE_PATH, используемый серверной программой электронной почты файла, теперь поддерживаетpathlib.Path.
Отчеты об ошибках¶
django.views.debug.SafeExceptionReporterFilterтеперь фильтрует конфиденциальные значения изrequest.METAв отчетах об исключениях.Новые атрибуты
SafeExceptionReporterFilter.cleansed_substituteиSafeExceptionReporterFilter.hidden_settingsпозволяют настраивать конфиденциальные параметры и фильтрациюrequest.METAв отчетах об исключениях.Техническое представление отладки 404 теперь учитывает
DEFAULT_EXCEPTION_REPORTER_FILTERпри применении фильтрации настроек.Новая настройка DEFAULT_EXCEPTION_REPORTER позволяет предоставить подкласс django.views.debug.ExceptionReporter для настройки генерации отчетов об исключениях. Подробности смотрите в Настройка отчета об ошибке.
Хранение файлов¶
Метод FileSystemStorage.save() теперь поддерживает
pathlib.Path.FileFieldиImageFieldтеперь принимают вызов дляхранилища. Это позволяет вам изменять используемое хранилище во время выполнения, например, выбирая разные хранилища для разных сред.
Формы¶
ModelChoiceIterator, используемыйModelChoiceFieldиModelMultipleChoiceField, теперь используетModelChoiceIteratorValue, который может использоваться виджетами для доступа к экземплярам модели. Подробности смотрите в Итерационный выбор отношений.django.forms.DateTimeFieldтеперь принимает даты в подмножестве форматов даты и времени ISO 8601, включая необязательный часовой пояс, например2019-10-10T06:47,2019-10-10T06:47:23+04:00или2019-10-10T06:47:23Z. Часовой пояс всегда будет сохраняться, если он указан, а дата и время с учетом часового пояса будут возвращены, даже еслиUSE_TZимеет значениеFalse.Кроме того, DateTimeField теперь использует DATE_INPUT_FORMATS в дополнение к DATETIME_INPUT_FORMATS при преобразовании ввода поля в значение datetime.
MultiWidget.widgetsтеперь принимает словарь, который позволяет настраивать атрибутыnameподвиджета.Новое свойство
BoundField.widget_typeможно использовать для динамической настройки рендеринга формы в зависимости от типа виджета.
Интернационализация¶
Параметр
LANGUAGE_COOKIE_SAMESITEтеперь позволяет значению ``“None“` (строковое) явно указывать, что файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.Добавлена поддержка и переводы на алжирский арабский, игбо, кыргызский, таджикский и туркменский языки.
Команды управления¶
Новая опция
check --databaseпозволяет указать псевдонимы базы данных для запуска системных проверокбазы данных. Ранее эти проверки были включены для всех настроенных БАЗ ДАННЫХ путем передачи тега базы данных в команду.Новая опция
migrate --checkпозволяет команде завершить работу с ненулевым статусом при обнаружении непримененных миграций.Новый аргумент
returncodeдляCommandErrorпозволяет настраивать статус завершения для команд управления.Новая опция
dbshell -- ARGUMENTSпозволяет передавать дополнительные аргументы клиенту командной строки для базы данных.Команды
flushиsqlflushтеперь включают SQL для сброса последовательностей в SQLite.
Модели¶
Новая функция
ExtractIsoWeekDayизвлекает дни недели ISO-8601 изDateFieldиDateTimeField, а новый поискiso_week_dayпозволяет делать запросы по ISO-8601 день недели.QuerySet.explain()теперь поддерживает:Формат
TREEв MySQL 8.0.16+,Опция
анализв MySQL 8.0.18+ и MariaDB.
Добавлен
PositiveBigIntegerField, который действует очень похоже наPositiveIntegerField, за исключением того, что он допускает значения только ниже определенного (зависящего от базы данных) предела. Значения от 0 до 9223372036854775807 безопасны во всех базах данных, поддерживаемых Django.Новая опция
RESTRICTдля аргументаon_deleteдляForeignKeyиOneToOneFieldэмулирует поведение SQL-ограниченияON DELETE RESTRICT.CheckConstraint.checknow supports boolean expressions.Методы
RelatedManager.add(),create()иset()теперь принимают вызываемые объекты в качестве значений в аргументеthrough_defaults.Новый параметр is_dst файла
QuerySet.datetimes()определяет обработку несуществующих и неоднозначных значений даты и времени.Новый метод выражения
Fbitxor()позволяет побитовую операцию XOR.QuerySet.bulk_create()теперь устанавливает первичный ключ для объектов при использовании MariaDB 10.5+.Метод DatabaseOperations.sql_flush() теперь генерирует более эффективный SQL в MySQL, используя DELETE вместо операторов TRUNCATE для таблиц, которые не требуют сброса последовательностей.
Функции SQLite теперь помечаются как
детерминированныев Python 3.8+. Это позволяет использовать их в проверочных ограничениях и частичных индексах.Новый атрибут
UniqueConstraint.deferrableпозволяет создавать отложенные уникальные ограничения.
Пагинация¶
Paginatorтеперь можно перебирать для получения страниц.
Запросы и ответы¶
Если
ALLOWED_HOSTSпуст иDEBUG=True, субдомены localhost теперь разрешены в заголовкеHost, напримерstatic.localhost.HttpResponse.set_cookie()иHttpResponse.set_signed_cookie()теперь позволяют использоватьsamesite='None'(строку), чтобы явно указать, что файл cookie отправляется со всеми односайтовыми и межсайтовыми запросами.Новый метод
HttpRequest.accepts()возвращает, принимает ли запрос данный тип MIME в соответствии с HTTP-заголовкомAccept.
Безопасность¶
Параметр
SECURE_REFERRER_POLICYтеперь по умолчанию имеет значение'same-origin'. При такой настройкеSecurityMiddlewareустанавливает для заголовка Политика рефералов значениеsame-originво всех ответах, в которых его еще нет. Это предотвращает отправку заголовка «Referer» в другие источники. Если вам нужно предыдущее поведение, явно установите дляSECURE_REFERRER_POLICYзначениеNone.Алгоритм по умолчанию для
django.core.signing.Signer,django.core.signing.loads()иdjango.core.signing.dumps()изменен на SHA-256. Поддержка подписей, созданных с помощью старого алгоритма SHA-1, сохраняется до Django 4.0.Кроме того, новый параметр
algorithmSignerпозволяет настраивать алгоритм хеширования.
Шаблоны¶
Переименованные теги шаблонов
translateиblocktranslateвводятся для интернационализации в коде шаблона. Старые псевдонимы тегов шаблоновtransиblocktransпродолжают работать и будут сохранены в обозримом будущем.Тег шаблона
includeтеперь принимает итерации имен шаблонов.
Тесты¶
SimpleTestCaseтеперь реализует методdebug(), позволяющий запускать тест без сбора результатов и перехвата исключений. Это можно использовать для поддержки запуска тестов под отладчиком.Новая настройка тестовой базы данных MIGRATE <TEST_MIGRATE> позволяет отключить миграцию во время создания тестовой базы данных.
Django test runner now supports a
test --bufferoption to discard output for passing tests.DiscoverRunnerтеперь пропускает запуск системных проверок баз данных, на которые не ссылаются тесты.Разбор
TransactionTestCaseв MySQL теперь происходит быстрее благодаря улучшениям командыflush. В качестве побочного эффекта последний больше не сбрасывает автоматически последовательности при демонтаже. ВключитеTransactionTestCase.reset_sequences, если ваши тесты требуют этой функции.
URL-адреса¶
Конвертеры путей теперь могут вызывать
ValueErrorвto_url(), чтобы указать на отсутствие совпадения при реверсировании URL-адресов.
Утилиты¶
filepath_to_uri()теперь поддерживаетpathlib.Path.parse_duration()теперь поддерживает разделители-запятые для десятичных дробей в формате ISO 8601.parse_datetime(),parse_duration()иparse_time()теперь поддерживают разделители-запятые для миллисекунд.
Разнообразный¶
Серверная часть SQLite теперь поддерживает
pathlib.Pathдля настройкиNAME.Файл
settings.py, созданный командойstartproject, теперь используетpathlib.Pathвместоos.pathдля построения путей к файловой системе.Параметр
TIME_ZONEтеперь разрешен в базах данных, поддерживающих часовые пояса.
Обратная несовместимость изменений в версии 3.1¶
Серверный API базы данных¶
В этом разделе описаны изменения, которые могут потребоваться в сторонних базах данных.
DatabaseOperations.fetch_returned_insert_columns()теперь требует дополнительного аргументаreturning_params.Свойство
connection.timezoneтеперь имеет значение'UTC'по умолчанию или значениеTIME_ZONE, когда :setting:USE_TZ` имеет значение ``Trueв базах данных, поддерживающих часовые пояса. Раньше в базах данных, поддерживающих часовые пояса, это было «Нет».Свойство
connection._nodb_connectionизменено на методconnection._nodb_cursor()и теперь возвращает контекстный менеджер, который создает курсор и автоматически закрывает курсор и соединение при выходе из оператораwith.DatabaseClient.runshell()теперь требует дополнительного аргументаparametersв качестве списка дополнительных аргументов для передачи клиенту командной строки.Позиционный аргумент
sequencesвDatabaseOperations.sql_flush()заменяется логическим аргументомreset_sequences, содержащим только ключевые слова. ЕслиTrue, последовательности усеченных таблиц будут сброшены.Аргумент
allow_cascadeвDatabaseOperations.sql_flush()теперь является аргументом, содержащим только ключевые слова.Позиционный аргумент
usingвDatabaseOperations.execute_sql_flush()удален. Теперь метод использует базу данных вызываемого экземпляра.Сторонние базы данных должны реализовать поддержку JSONField или установить для DatabaseFeatures.supports_json_field значение False. Если хранение примитивов не поддерживается, установите для
DatabaseFeatures.supports_primitives_in_json_fieldзначениеFalse. Если для JSON существует настоящий тип данных, установите дляDatabaseFeatures.has_native_json_fieldзначениеTrue. Еслиjsonfield.containsиjsonfield.contained_byне поддерживаются, установите дляDatabaseFeatures.supports_json_field_containsзначениеFalse.Сторонние базы данных должны реализовать интроспекцию для JSONField или установить для can_introspect_json_field значение False.
Прекращена поддержка MariaDB 10.1.¶
Восходящая поддержка MariaDB 10.1 заканчивается в октябре 2020 года. Django 3.1 поддерживает MariaDB 10.2 и выше.
contrib.admin поддержка браузера¶
Администратор больше не поддерживает устаревший браузер Internet Explorer. См. Часто задаваемые вопросы для администраторов для получения подробной информации о поддерживаемых браузерах.
AbstractUser.first_name max_length увеличено до 150¶
Включена миграция для django.contrib.auth.models.User.first_name. Если у вас есть пользовательская модель, унаследованная от «AbstractUser», вам необходимо сгенерировать и применить миграцию базы данных для вашей пользовательской модели.
Если вы хотите сохранить ограничение в 30 символов для имен, используйте специальную форму:
from django import forms
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
first_name = forms.CharField(max_length=30, required=False)
Если вы хотите сохранить это ограничение в администраторе при редактировании пользователей, установите UserAdmin.form для использования этой формы:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Разнообразный¶
Ключи кэша, используемые
cacheи генерируемыеmake_template_fragment_key(), отличаются от ключей, генерируемых более старыми версиями Django. После обновления до Django 3.1 первый запрос к любому ранее кэшированному фрагменту шаблона будет промахом в кэше.Логика решения о возврате резервного перенаправления или HTTP-ответа 204 из представления
set_language()теперь основана на HTTP-заголовкеAcceptвместо наличия HTTP-заголовкаX-Requested-With.Импорт совместимости django.core.Exceptions.EmptyResultSet в django.db.models.query, django.db.models.sql и django.db.models.sql.datastructures удален.
Импорт совместимости django.core.Exceptions.FieldDoesNotExist в django.db.models.fields удален.
Импорт совместимости django.forms.utils.pretty_name() и django.forms.boundfield.BoundField в django.forms.forms удален.
Импорт совместимости для
Context,ContextPopExceptionиRequestContextвdjango.template.baseудален.Импорт совместимости django.contrib.admin.helpers.ACTION_CHECKBOX_NAME в django.contrib.admin удален.
Настройки
STATIC_URLиMEDIA_URL, для которых заданы относительные пути, теперь имеют префикс предоставленного сервером значенияSCRIPT_NAME(или/, если он не установлен). Это изменение не должно повлиять на настройки действительных URL-адресов или абсолютных путей.ConditionalGetMiddlewareбольше не добавляет заголовокETagк ответам с пустымcontent.Декоратор
django.utils.decorators.classproperty()стал общедоступным и перемещен вdjango.utils.functional.classproperty().Фильтр шаблонов
floatformatтеперь выводит (положительный)0для отрицательных чисел, которые округляются до нуля.Meta.orderingиMeta.unique_togetherпараметры моделей в модуляхdjango.contrib, которые раньше были кортежами, теперь представляют собой списки.Виджет календаря администратора теперь обрабатывает двузначные годы в соответствии со спецификацией открытой группы, т. е. значения от 69 до 99 сопоставляются с предыдущим веком, а значения между 0 и 68 сопоставляются с текущим веком.
Форматы только даты удалены из списка по умолчанию для
DATETIME_INPUT_FORMATS.Виджет
FileInputбольше не отображается с HTML-атрибутомrequiredпри наличии исходных данных.Недокументированный класс django.views.debug.ExceptionReporterFilter удален. Согласно документации custom-error-reports, классы, которые будут использоваться с
DEFAULT_EXCEPTION_REPORTER_FILTER, должны наследовать отdjango.views.debug.SafeExceptionReporterFilter.Тайм-аут кэша, установленный декоратором
cache_page(), теперь имеет приоритет над директивойmax-ageиз заголовкаCache-Control.Предоставление нелокального удаленного поля в аргументе
ForeignKey.to_fieldтеперь вызываетFieldError.SECURE_REFERRER_POLICYтеперь по умолчанию имеет значение'same-origin'. Дополнительную информацию см. в разделе Что нового Безопасность выше.Команда управления
checkтеперь запускает системную проверку базы данных только для псевдонимов базы данных, указанных с помощью опцииcheck --database.migrateкоманда управления теперь запускает системубаза данныхи проверяет только базу данных для миграции.Классы CSS администратора
row1иrow2удалены в пользу псевдоклассов:nth-child(odd)и:nth-child(even).Функция
make_password()теперь требует, чтобы ее аргумент был строкой или байтами. Другие типы должны быть явно приведены к одному из них.Недокументированный параметр
versionдля функцииAsKMLудален.Сериализаторы JSON и YAML, используемые
dumpdata, теперь по умолчанию выгружают все данные в формате Unicode. Если вам нужно предыдущее поведение, передайтеensure_ascii=Trueсериализатору JSON илиallow_unicode=Falseсериализатору YAML.Автоперезагрузка больше не отслеживает изменения во встроенных файлах перевода Django.
Минимальная поддерживаемая версия mysqlclient увеличена с 1.3.13 до 1.4.0.
Недокументированные
django.contrib.postgres.forms.InvalidJSONInputиdjango.contrib.postgres.forms.JSONStringперемещены вdjango.forms.fields.Недокументированный класс django.contrib.postgres.fields.jsonb.JsonAdapter удален.
Тег
{% localize off %}и фильтрunlocalizeбольше не учитывают настройкуDECIMAL_SEPARATOR.Минимальная поддерживаемая версия asgiref увеличена с 3.2 до 3.2.10.
Класс Media теперь отображает теги
<script>без атрибутаtypeв соответствии с ``рекомендациями WHATWG <https://html.spec.whatwg.org/multipage/scripting.html#the-script-element>`_.ModelChoiceIterator, используемыйModelChoiceFieldиModelMultipleChoiceField, теперь дает варианты из двух кортежей, содержащие экземплярыModelChoiceIteratorValueв качестве первого элементvalueв каждом выборе. В большинстве случаев это прозрачное проксирование, но если вам нужно само значение поля, используйте вместо него атрибутModelChoiceIteratorValue.value.
Функции, устаревшие в версии 3.1¶
PostgreSQL JSONField¶
django.contrib.postgres.fields.JSONField и django.contrib.postgres.forms.JSONField устарели в пользу models.JSONField и forms.JSONField.
Недокументированные django.contrib.postgres.fields.jsonb.KeyTransform и django.contrib.postgres.fields.jsonb.KeyTextTransform также устарели в пользу преобразований в django.db.models.fields.json.
Новые JSONField, KeyTransform и KeyTextTransform можно использовать на всех поддерживаемых базах данных.
Разнообразный¶
Параметр
PASSWORD_RESET_TIMEOUT_DAYSустарел в пользуPASSWORD_RESET_TIMEOUT.Недокументированное использование поиска
isnullс нелогическими значениями в правой части устарело, вместо этого используйтеTrueилиFalse.Едва документированный класс исключений
django.db.models.query_utils.InvalidQueryустарел в пользуFieldDoesNotExistиFieldError.Точка входа django-admin.py устарела в пользу django-admin.
Метод
HttpRequest.is_ajax()устарел, поскольку он основан на специфичном для jQuery способе обозначения вызовов AJAX, в то время как в настоящее время используется JavaScript Fetch API. В зависимости от вашего варианта использования вы можете либо написать свой собственный метод обнаружения AJAX, либо использовать новый методHttpRequest.accepts(), если ваш код зависит от HTTP-заголовка клиентаAccept.Если вы пишете свой собственный метод обнаружения AJAX,
request.is_ajax()может быть воспроизведен точно так же, какrequest.headers.get('x-requested-with') == 'XMLHttpRequest'.Передача None в качестве первого аргумента в django.utils.deprecation.MiddlewareMixin.__init__() не рекомендуется.
Формат кодирования значений cookie, используемый
CookieStorage, отличается от формата, созданного более старыми версиями Django. Поддержка старого формата сохраняется до Django 4.0.Формат кодирования сеансов отличается от формата, созданного в старых версиях Django. Поддержка старого формата сохраняется до Django 4.0.
Чисто документальный аргумент «providing_args» для
Signalустарел. Если вы полагаетесь на этот аргумент в качестве документации, вы можете переместить текст в комментарий к коду или строку документации.Вызов django.utils.crypto.get_random_string() без аргумента length считается устаревшим.
Сообщение
listдляModelMultipleChoiceFieldустарело в пользуinvalid_list.Передача необработанных псевдонимов столбцов в
QuerySet.order_by()устарела. Того же результата можно добиться, передав вместо этого псевдонимы вRawSQLзаранее.The
NullBooleanFieldmodel field is deprecated in favor ofBooleanField(null=True).django.conf.urls.url()псевдонимdjango.urls.re_path()устарел.Теги шаблонов
{% ifequal %}и{% ifnotequal %}устарели в пользу{% if %}.{% if %}охватывает все варианты использования, но если вам нужно продолжать использовать эти теги, их можно извлечь из Django в модуль и включить в качестве встроенного тега в параметр'builtins'вOPTIONS.Переходная настройка
DEFAULT_HASHING_ALGORITHMустарела.
Функции удалены в версии 3.1¶
Эти функции достигли конца цикла устаревания и удалены в Django 3.1.
См. Функции, устаревшие в версии 2.2 для получения подробной информации об этих изменениях, в том числе о том, как прекратить использование этих функций.
django.utils.timezone.FixedOffsetудален.django.core.paginator.QuerySetPaginatorудален.Meta.ordering модели не влияет на запросы GROUP BY.
django.contrib.postgres.fields.FloatRangeFieldиdjango.contrib.postgres.forms.FloatRangeFieldудалены.Параметр FILE_CHARSET удален.
django.contrib.staticfiles.storage.CachedStaticFilesStorageудален.Метод RemoteUserBackend.configure_user() требует запроса в качестве первого позиционного аргумента.
Поддержка SimpleTestCase.allow_database_queries и TransactionTestCase.multi_db удалена.