Примечания к выпуску Django 3.0 ¶
2 декабря 2019 г.,
Добро пожаловать в Django 3.0!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 2.2 или более ранней версии. Мы отказались от некоторых функций , срок действия которых подошел к концу, и мы начали процесс прекращения поддержки некоторых функций .
См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.
Совместимость с Python ¶
Django 3.0 поддерживает Python 3.6, 3.7, 3.8 и 3.9 (по состоянию на 3.0.11). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Серия Django 2.2.x - последняя, поддерживающая Python 3.5.
Поддержка сторонних библиотек для более старой версии Django ¶
После выпуска Django 3.0 мы предлагаем сторонним авторам приложений отказаться от поддержки всех версий Django до 2.2. В то время вы должны иметь возможность запускать тесты вашего пакета, чтобы появлялись предупреждения об устаревании. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 3.0.python -Wd
Что нового в 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()
метода. - Добавлен
autocomplete
атрибут HTML в виджеты полей имени пользователя, электронной почты и пароляdjango.contrib.auth.forms
для лучшего взаимодействия с менеджерами паролей браузера. createsuperuser
теперь возвращается к переменным среды для пароля и обязательных полей, когда соответствующий аргумент командной строки не указан в неинтерактивном режиме.REQUIRED_FIELDS
теперь поддерживаетManyToManyField
s.- Новый
UserManager.with_perm()
метод возвращает пользователей с указанным разрешением. - Счетчик итераций по умолчанию для хешера паролей PBKDF2 увеличен со 150 000 до 180 000.
django.contrib.gis
¶
- Разрешил функциям пространственного поиска MySQL работать с реальной геометрией. Предыдущая поддержка была ограничена ограничивающими рамками.
- Добавлена
GeometryDistance
функция, поддерживаемая в PostGIS. - Добавлена поддержка
furlong
юнита в форматеDistance
. - Теперь
GEOIP_PATH
настройка поддерживаетсяpathlib.Path
. - Теперь
GeoIP2
класс принимает .pathlib.Path
path
django.contrib.postgres
¶
- Новое
RangeOperators
помогает избежать опечаток в операторах SQL, которые можно использовать вместе сRangeField
. - Новое
RangeBoundary
выражение представляет границы диапазона. - Новые
AddIndexConcurrently
иRemoveIndexConcurrently
классы позволяют создавать и удаление индексовCONCURRENTLY
на PostgreSQL.
django.contrib.sessions
¶
- Новый
get_session_cookie_age()
метод позволяет динамически указывать возраст cookie сеанса.
django.contrib.syndication
¶
- Добавлен
language
атрибут class для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
allows_group_by_selected_pks_on_model()
Запросы и ответы ¶
- Разрешено
HttpResponse
инициализировать с помощьюmemoryview
содержимого. - Например, для использования в шаблонах Django
HttpRequest.headers
теперь разрешен поиск с использованием подчеркиваний (напримерuser_agent
) вместо дефисов.
Безопасность ¶
X_FRAME_OPTIONS
теперь по умолчанию'DENY'
. В более старых версияхX_FRAME_OPTIONS
значение по умолчанию -'SAMEORIGIN'
. Если ваш сайт использует собственные фреймы, вам нужно будет явно настроить их, чтобы они продолжали работать.X_FRAME_OPTIONS = 'SAMEORIGIN'
SECURE_CONTENT_TYPE_NOSNIFF
теперь по умолчаниюTrue
. Если этот параметр включен,SecurityMiddleware
устанавливает заголовок X-Content-Type-Options: nosniff для всех ответов, в которых его еще нет.SecurityMiddleware
теперь можно отправить заголовок Referrer-Policy .
Тесты ¶
- Новый
Client
аргумент testraise_request_exception
позволяет контролировать, должны ли исключения, возникшие во время запроса, также возникать в тесте. Значение по умолчанию -True
для обратной совместимости. Если это такFalse
и возникает исключение, тестовый клиент вернет ответ 500 с атрибутомexc_info
, кортеж, содержащий информацию о произошедшем исключении. - Тесты и тестовые наборы для запуска можно выбрать по шаблону имени теста с помощью новой опции.
test -k
- Сравнение HTML, используемое в
assertHTMLEqual()
настоящее время, обрабатывает текст, ссылки на символы и ссылки на сущности, которые ссылаются на один и тот же символ, как на эквивалент. - Средство запуска тестов Django теперь поддерживает безголовый режим для тестов на селен в поддерживаемых браузерах. Добавьте
--headless
возможность включить этот режим. - Средство запуска тестов Django теперь поддерживает
--start-at
и--start-after
параметры для запуска тестов, начиная с определенного модуля верхнего уровня. - Средство запуска тестов Django теперь поддерживает
--pdb
возможность запускать отладчик при каждой ошибке или сбое.
Обратно несовместимые изменения в 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()
и т.д. - Записи для
AutoField
,BigAutoField
иSmallAutoField
добавляются дляDatabaseOperations.integer_field_ranges
поддержки валидаторов целочисленного диапазона для этих типов полей. Сторонним серверным модулям может потребоваться настроить записи по умолчанию. 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()
- Строки не имеют префиксов u в Python 3.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_PERMISSIONS
теперь по умолчанию используется, чтобы 0o644
избежать этого несоответствия.
Новые значения по умолчанию для настроек безопасности ¶
Чтобы сделать проекты Django более безопасными по умолчанию, некоторые параметры безопасности теперь имеют более безопасные значения по умолчанию:
X_FRAME_OPTIONS
теперь по умолчанию'DENY'
.SECURE_CONTENT_TYPE_NOSNIFF
теперь по умолчаниюTrue
.
Дополнительные сведения об этих изменениях см. В разделе «Новые возможности безопасности» выше.
Разное ¶
ContentType.__str__()
теперь включает моделиapp_label
для устранения неоднозначности моделей с одинаковыми именами в разных приложениях.- Поскольку доступ к языку в сеансе, а не в
LocaleMiddleware
файле cookie устарел, он больше не ищет язык пользователя в сеансе и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
как фраза в единственном числе, а все другие числовые значения как множественное число. Это может быть неверно для некоторых языков.- Присвоение значения атрибуту модели
ForeignKey
или теперь отменяет установку соответствующего поля. Последующий доступ к полю приведет к запросу.OneToOneField
'_id'
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
значениями, которые должны быть переданы в представление для необязательных именованных групп, которые отсутствуют.
Функции, устаревшие в версии 3.0 ¶
django.utils.encoding.force_text()
и smart_text()
¶
smart_text()
И 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 язык всегда сохраняется вLANGUAGE_COOKIE_NAME
cookie. 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
аргумента оField.from_db_value()
иExpression.convert_value()
удалена. field_name
Ключевое слово аргументQuerySet.earliest()
иlatest()
удаляется.
Подробную информацию об этих изменениях, в том числе о том, как удалить использование этих функций, см. В разделе « Функции, не рекомендуемые в версии 2.1» .
- Функция
ForceRHR
ГИС удалена. django.utils.http.cookie_date()
устранен.- В
staticfiles
иadmin_static
библиотеки шаблонов тегов удаляются. django.contrib.staticfiles.templatetags.staticfiles.static()
устранен.