Примечания к выпуску Django 3.0 ¶
2 декабря 2019 г.,
Добро пожаловать в Django 3.0!
Эти примечания к выпуску охватывают новые функции , а также некоторые изменения, не имеющие обратной совместимости, о которых следует помнить при обновлении с Django 2.2 или более ранней версии. Мы отказались от некоторых функций , срок действия которых подошел к концу, и начали процесс отказа от некоторых функций .
См. « Обновление Django до новой версии», если вы обновляете существующий проект.
Совместимость с Python ¶
Django 3.0 требует Python 3.6, 3.7 или 3.8. Мы настоятельно рекомендуем и официально поддерживаем только последнюю версию каждой серии.
Серия Django 2.2.x является последней версией, поддерживающей Python 3.5.
Поддержка сторонних библиотек для более старых версий Django ¶
После выпуска Django 3.0 мы предлагаем, чтобы сторонние приложения больше не поддерживали версии Django старше 2.2. На этом этапе вы должны иметь возможность запускать тесты для своего проекта с помощью python -Wd, чтобы вывести предупреждения об устаревании. После их исправления ваше приложение должно быть совместимо с Django 3.0.
Что нового в Django 3.0 ¶
Поддержка MariaDB ¶
Django теперь официально поддерживает MariaDB 10.1 или новее. Прочтите заметки MariaDB для получения более подробной информации.
Поддержка ASGI ¶
Django 3.0 начинает путь к асинхронной функциональности Django, обеспечивая поддержку запуска приложений ASGI .
Это дополнение к существующей поддержке протокола WSGI. Django планирует поддерживать обе версии в будущем. Однако асинхронная функциональность будет доступна только для приложений, работающих с ASGI.
На этом этапе поддержка асинхронного режима применяется только к внешнему приложению ASGI. Внутренне все остается синхронным. Асинхронное промежуточное ПО, представления и т. Д. пока не поддерживаются. Однако вы можете использовать промежуточное ПО ASGI для приложения Django, что позволяет комбинировать Django с другими фреймворками ASGI.
Нет необходимости преобразовывать ваши приложения, если вы не хотите экспериментировать с асинхронным кодом; если вы хотите узнать больше, вы можете прочитать документацию по развертыванию с помощью ASGI .
Обратите внимание, что побочным эффектом этой новой функции является то, что Django теперь может обнаруживать асинхронные циклы событий и предотвращает вызов кода, помеченного как небезопасный для асинхронного («асинхронный небезопасный»), например операции с ORM из асинхронного контекста. Если вы ранее использовали Django из асинхронного кода, это могло бы привести к сбою, если вы сделали это неправильно. Если вы видите ошибку SynchronousOnlyOperation
, внимательно изучите свой код и вместо этого переместите все операции с базой данных в синхронный поток.
Ограничения исключения в PostgreSQL ¶
Новый класс ExclusionConstraint
позволяет добавлять ограничения исключения в PostgreSQL. Эти ограничения могут быть добавлены к моделям с помощью опции Meta.constraints
.
Выражения фильтра ¶
Выражения, которые дают результаты, BooleanField
теперь можно использовать непосредственно в фильтрах QuerySet
, без необходимости проходить предыдущую аннотацию и фильтр в этой аннотации.
Перечисления для выбора модельного поля ¶
Пользовательские типы перечисления TextChoices
, IntegerChoices
и Choices
теперь доступны для того , чтобы определить Field.choices
. Типы TextChoices
и IntegerChoices
предоставляются для текстовых и целочисленных полей. Класс Choices
позволяет определить перечисление, совместимое с другими типами конкретных данных. Эти настраиваемые типы поддерживают удобные для пользователя метки, которые можно преобразовать и получить с помощью свойства перечисления или его членов. Прочтите « Перечисляемые типы» для получения более подробной информации и примеров.
Незначительные особенности ¶
django.contrib.admin
¶
- Поддержка атрибутов
admin_order_field
для свойств вModelAdmin.list_display
. - Новый метод
ModelAdmin.get_inlines()
позволяет определять встроенные подчиненные формы на основе запроса или экземпляра модели. - Библиотека Select2 обновлена с версии 4.0.3 до 4.0.7.
- Встроенная версия jQuery обновлена с 3.3.1 до 3.4.1.
django.contrib.auth
¶
- Новый атрибут
reset_url_token
вPasswordResetConfirmView
позволяет вам определять параметр токена, отображаемый как компонент URL-адресов для сброса пароля. - Класс
BaseBackend
был добавлен для облегчения настройки механизмов аутентификации. - Метод
get_user_permissions()
был добавлен, чтобы повторить существующий методget_group_permissions()
. - Атрибут HTML
autocomplete
был добавлен в компоненты поля имени пользователя, электронной почты и пароляdjango.contrib.auth.forms
для лучшего взаимодействия с менеджерами паролей браузера. createsuperuser
возвращается к переменным среды для полей пароля и других обязательных полей, когда не находит соответствующий параметр в командной строке в неинтерактивном режиме.REQUIRED_FIELDS
теперь поддерживает поляManyToManyField
.- Новый метод
UserManager.with_perm()
возвращает пользователей с указанным разрешением. - Количество итераций по умолчанию для хэша пароля PBKDF2 увеличено со 150 000 до 180 000.
django.contrib.gis
¶
- Функции пространственного запроса MySQL теперь работают с реальной геометрией. Ранее учитывались только ограничивающие рамки.
GeometryDistance
Добавлена функция , поддерживаемая PostGIS.furlong
Добавлена опора блока (паза)Distance
.- Теперь настройка
GEOIP_PATH
принимает путиpathlib.Path
. - Теперь класс
GeoIP2
принимает путиpathlib.Path
.
django.contrib.postgres
¶
- Новый класс
RangeOperators
помогает избежать синтаксических ошибок в операторах SQL, которые можно использовать вместе сRangeField
. - Новое выражение
RangeBoundary
представляет пределы интервалов. - Новые классы
AddIndexConcurrently
иRemoveIndexConcurrently
позволяют создавать и удалять индексы одновременно с PostgreSQL.
django.contrib.sessions
¶
- Новый метод
get_session_cookie_age()
позволяет динамически определять возраст файла cookie сеанса.
django.contrib.syndication
¶
- Атрибут класса
language
был добавлен, чтобыdjango.contrib.syndication.views.Feed
иметь возможность настраивать язык ленты. По умолчаниюget_language()
вместоLANGUAGE_CODE
.
Кэш ¶
add_never_cache_headers()
аnever_cache()
теперь добавляем директивуprivate
в заголовкиCache-Control
.
Файловое хранилище ¶
- Новый метод
Storage.get_alternative_name()
позволяет адаптировать алгоритм генерации имен файлов, когда имя загруженного файла уже существует.
Формы ¶
- Наборы форм могут управлять компонентом, используемым для сортировки форм, с
can_order
помощью установки атрибутаordering_widget
или переопределенияget_ordering_widget()
.
Интернационализация ¶
- Настройки
LANGUAGE_COOKIE_HTTPONLY
,LANGUAGE_COOKIE_SAMESITE
иLANGUAGE_COOKIE_SECURE
были добавлены в набор флаговHttpOnly
,SameSite
иSecure
на языке печенье. Значения по умолчанию для этих параметров сохраняют историческое поведение. - Добавлена поддержка узбекских переводов.
Ведение журнала ¶
- Новый параметр
reporter_class
вAdminEmailHandler
позволяет обеспечить подкласс ,django.views.debug.ExceptionReporter
чтобы настроить текст трассировки ошибок отправляютсяADMINS
на сайт , когда этоDEBUG
стоитFalse
.
Команды администрирования ¶
- Новая опция позволяет игнорировать определенные каталоги при поиске файлов для компиляции.
compilemessages --ignore
.po
showmigrations --list
теперь отображает дату подачи заявки, когда--verbosity
2 и более.- В PostgreSQL
dbshell
теперь поддерживаются клиентские сертификаты TLS. inspectdb
теперь может обнаруживать поля,OneToOneField
когда внешний ключ имеет ограничение уникальности или первичного ключа.- Новая опция
--skip-checks
пропускает выполнение системных проверок перед подачей команды. - Параметры и теперь поддерживают шаблоны, хранящиеся в архивах XZ ( , ) и LZMA ( , ).
startapp --template
startproject --template
.tar.xz
.txz
.tar.lzma
.tlz
Модели ¶
Генерирующие функции базы данных отпечатки ног
MD5
,SHA1
,SHA224
,SHA256
,SHA384
иSHA512
были добавлены.Sign
Добавлена функция базы данных .Новый параметр
is_dst
для функций базы данныхTrunc
определяет обработку несуществующих или неоднозначных времен.connection.queries
теперь отображает инструкции с PostgreSQL.COPY … TO
FilePathField
теперь принимает исполняемый объект дляpath
.Симметричные промежуточные таблицы разрешены для саморегулируемых полей
ManyToManyField
.Атрибуты
name
изCheckConstraint
,UniqueConstraint
и вIndex
настоящее время класс поддержки и применение этикеток интерполяции с использованием'%(app_label)s'
и заполнителей'%(class)s'
.Новый атрибут
Field.descriptor_class
позволяет полям шаблона настраивать поведение получения и установки путем переопределения их дескрипторов .Поле
SmallAutoField
добавлено; он аналогичен, заAutoField
исключением того, что допускает значения только до определенного предела (зависит от базы данных). Значения от1
до32767
действительны для всех баз данных, поддерживаемых Django.AutoField
,BigAutoField
ИSmallAutoField
теперь наследуют соответственноIntegerField
,BigIntegerField
иSmallIntegerField
. Системные проверки и валидаторы также правильно наследуются.FileField.upload_to
теперь принимает путиpathlib.Path
.CheckConstraint
теперь поддерживается MySQL 8.0.16+.Новый метод
allows_group_by_selected_pks_on_model()
изdjango.db.backends.base.BaseDatabaseFeatures
Оптимизирует пунктов требовать только первичный ключ выбранных моделей. По умолчанию он поддерживается только для моделей, управляемых с помощью PostgreSQL.GROUP BY
Чтобы включить оптимизацию только по первичному ключу для неуправляемых моделей, необходимо создать подкласс ядра СУБД PostgreSQL, при необходимости переопределив класс функциональности с помощью метода . См. Пример подклассов интегрированного ядра СУБД .
GROUP BY
features
allows_group_by_selected_pks_on_model()
Запросы и ответы ¶
HttpResponse
теперь можно инициализировать с помощью содержимогоmemoryview
.- Например, для использования в шаблонах Django
HttpRequest.headers
теперь разрешен поиск с использованием подчеркивания (напримерuser_agent
) вместо дефисов.
Безопасность ¶
- Значение по умолчанию
X_FRAME_OPTIONS
- сейчас'DENY'
. В более старых версиях это значение по умолчанию было'SAMEORIGIN'
. Если ваш сайт использует фреймы сами по себе, вам нужно будет явно определить их, чтобы они работали.X_FRAME_OPTIONS = 'SAMEORIGIN'
SECURE_CONTENT_TYPE_NOSNIFF
теперь по умолчаниюTrue
. Если этот параметр включен,SecurityMiddleware
устанавливает заголовок X-Content-Type-Options: nosniff для всех ответов, в которых его еще нет.SecurityMiddleware
теперь можно отправить заголовок Referrer-Policy .
Тесты ¶
- Новый параметр
raise_request_exception
тестового классаClient
определяет, должны ли исключения, сгенерированные во время запроса, распространяться в тестах. По умолчанию используетсяTrue
для обратной совместимости. Когда установленоFalse
и возникает исключение, тестовый клиент вернет ответ 500 с атрибутомexc_info
, кортеж, содержащий информацию о возникшем исключении. - Тесты и тестовые примеры для запуска можно выбрать по шаблону имени теста с помощью новой опции .
test -k
- Сравнение HTML, используемое в
assertHTMLEqual()
настоящее время, обрабатывает текст, ссылки на символы и ссылки на сущности, которые ссылаются на один и тот же символ, как на эквиваленты. - Средство запуска тестов Django теперь поддерживает режим без интерфейса для тестов Selenium с поддерживаемыми браузерами. Добавьте возможность
--headless
активировать этот режим. - Средство запуска тестов Django теперь поддерживает параметры
--start-at
и--start-after
запускает тесты, начиная с определенного модуля первого уровня. - Средство выполнения тестов Django теперь поддерживает возможность
--pdb
запускать отладчик при каждой ошибке или сбое.
Изменения, несовместимые со старыми версиями Django 3.0 ¶
Model.save()
при предоставлении значения по умолчанию для первичного ключа ¶
Model.save()
больше не пытается найти строку при сохранении нового
Model
экземпляра и предоставляется значение по умолчанию для первичного ключа, и всегда выполняет один INSERT
запрос. В более старых версиях Django
Model.save()
выполняется либо, INSERT
либо в UPDATE
зависимости от того, существует ли строка.
Это делает вызов Model.save()
при предоставлении значения первичного ключа по умолчанию эквивалентным передаче force_insert = True в модель save()
. Попытки использовать новый Model
экземпляр для обновления существующей строки приведут к созданию файла IntegrityError
.
Чтобы обновить существующую модель для определенного значения первичного ключа, используйте
update_or_create()
метод или
QuerySet.filter(pk=…).update(…)
вместо него. Например:
>>> MyModel.objects.update_or_create(pk=existing_pk, defaults={'name': 'new name'})
>>> MyModel.objects.filter(pk=existing_pk).update(name='new name')
API ядра СУБД ¶
В этом разделе описаны изменения, которые могут потребоваться в сторонних ядрах баз данных.
- Вторым параметром
DatabaseIntrospection.get_geometry_type()
теперь является описание строки вместо имени столбца. DatabaseIntrospection.get_field_type()
больше не обязательно возвращает кортежи.- Если база данных может создавать внешние ключи в том же операторе SQL, который добавляет поле, добавьте атрибут
SchemaEditor.sql_create_column_inline_fk
в ее механизм с соответствующим содержимым SQL; в противном случае установите .DatabaseFeatures.can_create_inline_fk = False
DatabaseFeatures.can_return_id_from_insert
иcan_return_ids_from_bulk_insert
переименованы вcan_return_columns_from_insert
иcan_return_rows_from_bulk_insert
.- Функции базы данных теперь поддерживают форматы
datetime.timezone
при создании с экземплярамиdatetime.timedelta
(напримерtimezone(timedelta(hours=5))
, которые будут выводить'UTC+05:00'
). Третий двигатель должен учитывать этот аспект при подготовкеDateTimeField
вdatetime_cast_date_sql()
, иdatetime_extract_sql()
т.д. - Строки добавляются
DatabaseOperations.integer_field_ranges
для полейAutoField
,BigAutoField
а также вSmallAutoField
целях поддержки валидаторов диапазона целых чисел для этих типов полей. Сторонним движкам, возможно, придется адаптировать строки по умолчанию. DatabaseOperations.fetch_returned_insert_id()
заменяется наfetch_returned_insert_columns()
то, что возвращает список значений, возвращаемых оператором, вместо одного значения.INSERT … RETURNING
DatabaseOperations.return_insert_id()
заменяется наreturn_insert_columns()
то, что принимает параметр,fields
который является итеративным из полей, возвращаемых после вставки. Обычно это просто автоматически сгенерированное поле первичного ключа.
django.contrib.admin
¶
- Сообщения об изменении истории шаблонов сайта администрирования теперь предпочитают более читаемые метки полей, а не имена полей.
django.contrib.gis
¶
- Поддержка PostGIS 2.1 была удалена.
- Поддержка SpatiaLite 4.1 и 4.2 была удалена.
- Поддержка GDAL 1.11 и GEOS 3.4 была удалена.
Прекращение поддержки PostgreSQL 9.4 ¶
Поддержка PostgreSQL 9.4 в апстриме заканчивается в декабре 2019 года. Django 3.0 поддерживает PostgreSQL 9.5 и новее.
Прекращение поддержки Oracle 12.1 ¶
Поддержка Oracle 12.1 в восходящем направлении заканчивается в июле 2021 года. Django 2.2 будет поддерживаться до апреля 2022 года. Django 3.0 официально поддерживает Oracle 12.2 и 18c.
Частные API совместимости Python 2 были удалены. ¶
Хотя поддержка Python 2 была удалена в Django 2.0, некоторые частные API-интерфейсы не были удалены из Django, чтобы сторонние приложения могли продолжать использовать их до истечения срока действия Python 2.
Поскольку мы ожидаем, что приложения потеряют совместимость с Python 2 при добавлении поддержки Django 3.0, мы удаляем эти API в этом выпуске.
django.test.utils.str_prefix()
- В Python 3 строки больше не имеют префикса «u».django.test.utils.patch_logger()
- Используйтеunittest.TestCase.assertLogs()
вместо этого.django.utils.lru_cache.lru_cache()
- Псевдонимfunctools.lru_cache()
.django.utils.decorators.available_attrs()
- Эта функция возвращаетсяfunctools.WRAPPER_ASSIGNMENTS
.django.utils.decorators.ContextDecorator
- Псевдонимcontextlib.ContextDecorator
.django.utils._os.abspathu()
- Псевдонимos.path.abspath()
.django.utils._os.upath()
иnpath()
- Эти функции больше ничего не делают в Python 3.django.utils.six
- Откажитесь от использования этой встроенной библиотеки или перейдите к шести .django.utils.encoding.python_2_unicode_compatible()
- Псевдонимsix.python_2_unicode_compatible()
.django.utils.functional.curry()
- Используйтеfunctools.partial()
илиfunctools.partialmethod
. См. 5b1c389603a353625ae1603 .django.utils.safestring.SafeBytes
- Не используется с Django 2.0.
Новая настройка по умолчанию FILE_UPLOAD_PERMISSIONS
¶
В предыдущих версиях настройка FILE_UPLOAD_PERMISSIONS
была по None
умолчанию. С менеджером по умолчанию FILE_UPLOAD_HANDLERS
это может привести к тому, что загруженные файлы будут иметь разные разрешения в зависимости от их размера и, следовательно, от того, какой менеджер загрузки был использован.
FILE_UPLOAD_PERMISSION
теперь содержит 0o644
по умолчанию, чтобы избежать этой несогласованности.
Новые настройки безопасности по умолчанию ¶
Чтобы сделать проекты Django более безопасными по умолчанию, некоторые параметры безопасности теперь имеют более безопасные значения по умолчанию:
- Новое значение по умолчанию для
X_FRAME_OPTIONS
это'DENY'
. - Новое значение по умолчанию для
SECURE_CONTENT_TYPE_NOSNIFF
этоTrue
.
Дополнительные сведения об этих изменениях см. В разделе безопасности о новых возможностях Django 3.0.
Разное ¶
ContentType.__str__()
теперь включает меткуapp_label
модели, чтобы различать модели с одинаковыми именами в разных приложениях.- Поскольку доступ к языку в сеансе был заменен куки-файлами, он
LocaleMiddleware
больше не ищет язык пользователя в сеансе иdjango.contrib.auth.logout()
больше не сохраняет язык сеанса после отключения. django.utils.html.escape()
теперь используетhtml.escape()
HTML-код для экранирования. Одинарная кавычка'
теперь преобразована'
в эквивалент в десятичном формате'
.- Эта опция теперь работает как опция, а не как ярлык .
django-admin test -k
unittest -k
--keepdb
- Поддержка
pywatchman
<1.2.0 прекращена. urlencode()
Теперь кодирует повторяемые значения такими, какие они естьdoseq=False
, а не зацикливать их, что ближе к поведению стандартной библиотечной функцииurllib.parse.urlencode()
.- Фильтр шаблонов
intword
теперь переводит предложение1.0
в единственном числе, а все другие числовые значения во множественное число, что не всегда правильно на разных языках. - Присваивание значения атрибуту
'_id'
поляForeignKey
илиOneToOneField
стирание значения соответствующего поля. Любой последующий доступ к этому полю приведет к новому запросу. patch_vary_headers()
теперь обрабатывает звездочку'*'
в соответствии сRFC 7231 # section-7.1.4 , то есть, если список имен полей заголовка содержит звездочку, заголовокVary
будет сформирован с одной звездочкой'*'
.- С MySQL 8.0.16+,
PositiveIntegerField
иPositiveSmallIntegerField
теперь включает проверочное ограничение для предотвращения отрицательных значений в базе данных. alias=None
был добавлен в подписьExpression.get_group_by_cols()
.RegexPattern
, используемый пользователемre_path()
, больше не возвращает аргументы ключевого слова соNone
значениями, которые должны быть переданы в представление для необязательных именованных групп, которые отсутствуют.
Функции, устаревшие в Django 3.0 ¶
django.utils.encoding.force_text()
и smart_text()
¶
Псевдонимы smart_text()
and force_text()
(начиная с Django 2.0) smart_str()
и force_str()
устарели. Вы можете игнорировать предупреждение, если ваш код поддерживает Python 2, потому что поведение smart_str()
и force_str()
в этом контексте отличается.
Разное ¶
django.utils.http.urlquote()
,urlquote_plus()
,urlunquote()
Иurlunquote_plus()
являются нежелательными в пользу тех функций , для которых они являются псевдонимами:urllib.parse.quote()
,quote_plus()
,unquote()
иunquote_plus()
.django.utils.translation.ugettext()
,ugettext_lazy()
,ugettext_noop()
,ungettext()
Иungettext_lazy()
являются устаревшими в пользу тех функций , для которых они являются псевдонимами:django.utils.translation.gettext()
,gettext_lazy()
,gettext_noop()
,ngettext()
иngettext_lazy()
.- Чтобы ограничить создание сеансов и, следовательно, отдать предпочтение определенным стратегиям кеширования,
django.views.i18n.set_language()
перестанет определять язык пользователя в сеансе из Django 4.0. Начиная с Django 2.1 язык всегда хранится в cookieLANGUAGE_COOKIE_NAME
. django.utils.text.unescape_entities()
устарело в пользуhtml.unescape()
. Обратите внимание, что в отличие отunescape_entities()
,html.unescape()
немедленно оценивает отложенные строки.- Чтобы избежать возможной путаницы в отношении ее фактического объема, внутренняя частная утилита
is_safe_url()
была переименована вurl_has_allowed_host_and_scheme()
. То, что протокол URL и хост разрешены, обычно не означает, что он безопасен. Например, он мог быть неправильно закодирован. Обязательно примените такжеiri_to_uri()
к части пути недоверенных исходных URL.
Функции, удаленные в версии 3.0 ¶
Эти функции достигли конца цикла устаревания и постепенно прекращаются в Django 3.0.
Подробную информацию об этих изменениях, а также о том, как отменить использование этих функций, см. В разделе « Функции, не рекомендуемые в версии 2.0» .
- Модуль
django.db.backends.postgresql_psycopg2
удален. django.shortcuts.render_to_response()
был удален.- Настройка
DEFAULT_CONTENT_TYPE
удалена. HttpRequest.xreadlines()
был удален.- Удалена поддержка параметра
context
fromField.from_db_value()
и fromExpression.convert_value()
. - Именованный параметр
field_name
ofQuerySet.earliest()
и oflatest()
был удален.
См. « Функции, не рекомендуемые в Django 2.1» для получения подробной информации об этих изменениях, а также о том, как запретить использование этих функций.
- Функция ГИС
ForceRHR
удалена. django.utils.http.cookie_date()
был удален.- Библиотеки тегов шаблонов
staticfiles
иadmin_static
были удалены. django.contrib.staticfiles.templatetags.staticfiles.static()
был удален.