Примечания к выпуску Django 3.1¶
4 августа 2020
Добро пожаловать в Django 3.1!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы захотите знать при переходе с Django 3.0 или более ранней версии. Мы dropped some features, которые достигли конца своего цикла устаревания, и мы begun the deprecation process for some features.
См. руководство Как обновить Django до более новой версии, если вы обновляете существующий проект.
Совместимость с Python¶
Django 3.1 поддерживает Python 3.6, 3.7, 3.8 и 3.9 (начиная с версии 3.1.3). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Что нового в Django 3.1¶
Асинхронные представления и поддержка промежуточного ПО¶
Django теперь поддерживает полностью асинхронный путь запроса, включая:
Чтобы начать работу с асинхронными представлениями, необходимо объявить представление, используя async def:
async def my_view(request):
await asyncio.sleep(0.5)
return HttpResponse("Hello, async world!")
Все асинхронные функции поддерживаются независимо от того, работаете ли вы в режиме WSGI или ASGI. Однако, использование асинхронного кода в режиме WSGI будет снижать производительность. Подробнее об особенностях вы можете прочитать в документации Поддержка асинхронного режима.
Вы можете смешивать async и sync представления, промежуточное ПО и тесты сколько угодно. Django позаботится о том, чтобы вы всегда получали правильный контекст выполнения. Мы ожидаем, что большинство проектов будут держать большинство своих представлений синхронными, и только некоторые будут работать в режиме async - но это полностью ваш выбор.
ORM, слой кэша и другие части кода Django, которые выполняют длительные сетевые вызовы, пока не поддерживают асинхронный доступ. Мы ожидаем добавить их поддержку в ближайших релизах. Асинхронные представления идеальны, однако, если вы выполняете много вызовов API или HTTP внутри вашего представления, теперь вы можете выполнять все эти HTTP вызовы параллельно, что значительно ускорит выполнение вашего представления.
Асинхронная поддержка должна быть полностью обратно совместима, и мы постарались сделать так, чтобы она не имела никаких регрессий в скорости для вашего существующего синхронного кода. Это не должно оказать заметного влияния на существующие проекты Django.
JSONField для всех поддерживаемых бэкендов баз данных¶
Django теперь включает models.JSONField и forms.JSONField, которые могут быть использованы на всех поддерживаемых бэкендах баз данных. Оба поля поддерживают использование пользовательских кодировщиков и декодировщиков JSON. Поле модели поддерживает интроспекцию, lookups, and transforms, которые ранее были только для 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, а также связанные с ним поле формы и преобразования, вам следует перестроиться на использование новых полей, а также создать и применить миграцию базы данных. На данный момент старые поля и преобразования оставлены в качестве ссылки на новые и являются deprecated as of this release.
DEFAULT_HASHING_ALGORITHM настройки¶
Новый переходный параметр DEFAULT_HASHING_ALGORITHM позволяет указать алгоритм хэширования по умолчанию, который будет использоваться для кодирования cookies, токенов сброса пароля на сайте администратора, пользовательских сессий и подписей, созданных с помощью django.core.signing.Signer и django.core.signing.dumps().
Поддержка SHA-256 была добавлена в Django 3.1. Если вы обновляете несколько экземпляров одного и того же проекта до Django 3.1, вам следует установить DEFAULT_HASHING_ALGORITHM на 'sha1' во время перехода, чтобы обеспечить совместимость со старыми версиями Django. Обратите внимание, что для этого требуется Django 3.1.1+. После завершения перехода на 3.1 вы можете перестать переопределять DEFAULT_HASHING_ALGORITHM.
Этот параметр устарел в этом выпуске, поскольку поддержка токенов, cookies, сессий и подписей, использующих алгоритм SHA-1, будет удалена в Django 4.0.
Незначительные особенности¶
django.contrib.admin¶
Новая функция
django.contrib.admin.EmptyFieldListFilterдляModelAdmin.list_filterпозволяет фильтровать пустые значения (пустые строки и нули) в представлении списка изменений администратора.Фильтры в правой боковой панели просмотра списка изменений администратора теперь содержат ссылку для очистки всех фильтров.
На больших экранах администратор теперь имеет боковую панель для более удобной навигации. Она включена по умолчанию, но может быть отключена с помощью пользовательского
AdminSiteи установкиAdminSite.enable_nav_sidebarнаFalse.Рендеринг боковой панели требует доступа к текущему запросу, чтобы установить CSS и ARIA-ролевые возможности. Это требует использования
'django.template.context_processors.request'в опции'context_processors'вOPTIONS.Изначально пустые строки
extraтеперь можно удалять так же, как и динамически создаваемые.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¶
- Поиск
relateтеперь поддерживается на MariaDB. - Добавлено свойство
LinearRing.is_counterclockwise. AsGeoJSONтеперь поддерживается на Oracle.- Добавлены функции
AsWKBиAsWKT. - Добавлена поддержка PostGIS 3 и GDAL 3.
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_densitySearchRankпозволяет ранжировать по плотности покрова. - Новый параметр
normalizationSearchRankпозволяет нормализовать ранг. - Новый атрибут
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()теперь возвращаетTrue, если ключ был успешно удален,False- в противном случае.
CSRF¶
- Настройка
CSRF_COOKIE_SAMESITEтеперь позволяет'None'(строковое значение) явно указать, что cookie отправляется со всеми односайтовыми и межсайтовыми запросами.
Електронна пошта¶
- Настройка
EMAIL_FILE_PATH, используемая file email backend, теперь поддерживаетpathlib.Path.
Отчеты об ошибках¶
django.views.debug.SafeExceptionReporterFilterтеперь фильтрует чувствительные значения изrequest.METAв отчетах об исключениях.- Новые атрибуты
SafeExceptionReporterFilter.cleansed_substituteиSafeExceptionReporterFilter.hidden_settingsпозволяют настраивать чувствительные параметры иrequest.METAфильтровать в отчетах об исключениях. - В представлении отладки Technical 404 теперь соблюдается
DEFAULT_EXCEPTION_REPORTER_FILTERпри применении фильтрации настроек. - Новый
DEFAULT_EXCEPTION_REPORTERпозволяет предоставить подклассdjango.views.debug.ExceptionReporterдля настройки генерации отчета об исключениях. Подробности см. в разделе Пользовательские отчеты об ошибках.
Хранение файлов¶
- Метод
FileSystemStorage.save()теперь поддерживаетpathlib.Path. FileFieldиImageFieldтеперь принимают вызов дляstorage. Это позволяет изменять используемое хранилище во время выполнения, например, выбирать разные хранилища для разных сред.
Формы¶
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позволяет указать псевдонимы базы данных для запуска системных проверокdatabase. Ранее эти проверки включались для всех настроенныхDATABASESпутем передачи команде тега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+, analyzeопция на MySQL 8.0.18+ и MariaDB.
- Формат
- Добавлено
PositiveBigIntegerField, которое действует подобноPositiveIntegerField, за исключением того, что оно допускает только значения ниже определенного (зависящего от базы данных) предела. Значения от0до9223372036854775807безопасны во всех базах данных, поддерживаемых Django. - Новая опция
RESTRICTдля аргументаon_deleteв аргументахForeignKeyиOneToOneFieldэмулирует поведение SQL-ограниченияON DELETE RESTRICT. CheckConstraint.checkтеперь поддерживает булевы выражения.- Методы
RelatedManager.add(),create()иset()теперь принимают callables как значения в аргументеthrough_defaults. - Новый параметр
is_dstQuerySet.datetimes()определяет обработку несуществующих и неоднозначных дат. - Новый метод
Fвыраженияbitxor()позволяет bitwise XOR operation. QuerySet.bulk_create()теперь устанавливает первичный ключ для объектов при использовании MariaDB 10.5+.- Метод
DatabaseOperations.sql_flush()теперь генерирует более эффективный SQL на MySQL, используя операторыDELETEвместоTRUNCATEдля таблиц, которые не требуют сброса последовательностей. - Функции SQLite теперь помечены как
deterministicна Python 3.8+. Это позволяет использовать их в проверочных ограничениях и частичных индексах. - Новый атрибут
UniqueConstraint.deferrableпозволяет создавать откладываемые уникальные ограничения.
Запросы и ответы¶
- Если
ALLOWED_HOSTSпуст иDEBUG=True, то теперь в заголовкеHostразрешены поддомены localhost, например,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позволяет отключить миграции во время создания тестовой базы данных. - Бегунок тестирования Django теперь поддерживает опцию
test --bufferдля отбрасывания вывода для пройденных тестов. DiscoverRunnerтеперь пропускает выполнение системных проверок для баз данных не referenced by tests.TransactionTestCaseteardown теперь быстрее на MySQL благодаря улучшению командыflush. В качестве побочного эффекта последняя больше не сбрасывает автоматически последовательности при сносе. ВключитеTransactionTestCase.reset_sequences, если ваши тесты требуют этой возможности.
URLs¶
- Path converters теперь может поднимать
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, когдаUSE_TZравноTrueна базах данных, поддерживающих часовые пояса. Ранее оно былоNoneна базах данных, поддерживающих часовые пояса. - Свойство
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. Подробную информацию о поддерживаемых браузерах смотрите в the admin FAQ.
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, которые раньше были кортежами, теперь стали списками. - Виджет календаря администратора теперь обрабатывает двузначные годы в соответствии со спецификацией Open Group Specification, т.е. значения от 69 до 99 отображаются на предыдущий век, а значения от 0 до 68 отображаются на текущий век.
- Форматы только для даты удалены из списка по умолчанию для
DATETIME_INPUT_FORMATS. - Виджет
FileInputбольше не отображается с HTML-атрибутомrequiredпри наличии начальных данных. - Недокументированный класс
django.views.debug.ExceptionReporterFilterудален. Согласно документации Пользовательские отчеты об ошибках, классы, которые будут использоваться сDEFAULT_EXCEPTION_REPORTER_FILTER, должны наследоваться отdjango.views.debug.SafeExceptionReporterFilter. - Таймаут кэша, установленный декоратором
cache_page(), теперь имеет приоритет над директивойmax-ageиз заголовкаCache-Control. - Предоставление нелокального удаленного поля в аргументе
ForeignKey.to_fieldтеперь приводит к появлениюFieldError. SECURE_REFERRER_POLICYтеперь по умолчанию используется'same-origin'. Подробнее см. в разделе Что нового Security section выше.- Команда управления
checkтеперь запускает системные проверкиdatabaseтолько для псевдонимов баз данных, указанных с помощью опцииcheck --database. - Команда управления
migrateтеперь запускает системные проверкиdatabaseтолько для базы данных, подлежащей миграции. - Админские CSS-классы
row1иrow2удалены в пользу псевдоклассов:nth-child(odd)и:nth-child(even). - Функция
make_password()теперь требует, чтобы ее аргумент был строкой или байтом. Другие типы должны быть явно приведены к одному из этих типов. - Удален недокументированный параметр
versionв функцииAsKML. - JSON and YAML serializers, используемый
dumpdata, теперь по умолчанию передает все данные с Юникодом. Если вам нужно прежнее поведение, передайте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 recommendations. ModelChoiceIterator, используемыйModelChoiceFieldиModelMultipleChoiceField, теперь дает выбор из двух кортежей, содержащих экземплярыModelChoiceIteratorValueв качестве первогоvalueэлемента в каждом выборе. В большинстве случаев это прозрачное проксирование, но если вам нужно само значениеfield, используйте атрибут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.
Новые JSONFields, 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__()устарела.Формат кодировки значений cookies, используемый
CookieStorage, отличается от формата, генерируемого старыми версиями Django. Поддержка старого формата сохраняется до версии Django 4.0.Формат кодировки сессий отличается от формата, генерируемого старыми версиями Django. Поддержка старого формата сохранится до версии Django 4.0.
Чисто документальный аргумент
providing_argsдляSignalявляется устаревшим. Если вы полагаетесь на этот аргумент как на документацию, вы можете переместить текст в комментарий к коду или в doc-строку.Вызов
django.utils.crypto.get_random_string()без аргументаlengthявляется устаревшим.Сообщение
listдляModelMultipleChoiceFieldустарело в пользуinvalid_list.Передача необработанных псевдонимов столбцов в
QuerySet.order_by()устарела. Того же результата можно добиться, передав псевдонимы вRawSQLзаранее.Поле модели
NullBooleanFieldустарело в пользуBooleanField(null=True, blank=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()требуетrequestв качестве первого позиционного аргумента. - Поддержка
SimpleTestCase.allow_database_queriesиTransactionTestCase.multi_dbудалена.