Примечания к выпуску Django 2.2 ¶
1 апреля 2019 г.,
Добро пожаловать в Django 2.2!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 2.1 или более ранней версии. Мы начали процесс прекращения поддержки некоторых функций .
См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.
Django 2.2 обозначен как выпуск с долгосрочной поддержкой . Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущего LTS, Django 1.11, прекратится в апреле 2020 года.
Совместимость с Python ¶
Django 2.2 поддерживает Python 3.5, 3.6, 3.7, 3.8 (по состоянию на 2.2.8) и 3.9 (по состоянию на 2.2.17). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Что нового в Django 2.2 ¶
Ограничения ¶
Новое CheckConstraint
и
UniqueConstraint
классы дают возможность добавление ограничений пользовательских баз данных. Ограничения добавляются к моделям с помощью
Meta.constraints
опции.
Незначительные особенности ¶
django.contrib.admin
¶
- Добавлен класс CSS в заголовки столбцов
TabularInline
.
django.contrib.auth
¶
HttpRequest
Теперь передается в качестве первого позиционного аргументаRemoteUserBackend.configure_user()
, если он принимает его.
django.contrib.postgres
¶
- Новый
ordering
аргумент дляArrayAgg
иStringAgg
определяет порядок агрегированных элементов. - Новые
BTreeIndex
,HashIndex
иSpGistIndex
классы позволяют создаватьB-Tree
,hash
иSP-GiST
индексы в базе данных. BrinIndex
теперь естьautosummarize
параметр.- Новый
search_type
параметрSearchQuery
позволяет искать фразу или необработанное выражение.
django.contrib.staticfiles
¶
- В опцию добавлено сопоставление пути, чтобы можно было использовать шаблоны вроде .
collectstatic --ignore
/vendor/*.js
Бэкэнды базы данных ¶
- Добавлена потоковая передача результатов для
QuerySet.iterator()
SQLite.
Общие представления ¶
- Новый
View.setup
хук инициализирует атрибуты представления перед вызовомdispatch()
. Он позволяет миксинам настраивать атрибуты экземпляра для повторного использования в дочерних классах.
Интернационализация ¶
- Добавлена поддержка и переводы для армянского языка.
Команды управления ¶
- Новая
--force-color
опция принудительно раскрашивает вывод команды. inspectdb
теперь создает модели для сторонних таблиц в PostgreSQL.inspectdb --include-views
теперь создает модели для материализованных представлений в Oracle и PostgreSQL.- Новая опция позволяет создавать модели для таблиц разделов на PostgreSQL. В более старых версиях модели создаются дочерние таблицы вместо родительских.
inspectdb --include-partitions
inspectdb
теперь самоанализDurationField
для Oracle и PostgreSQL, а такжеAutoField
для SQLite.- В Oracle
dbshell
оборачиваетсяrlwrap
, если доступно.rlwrap
обеспечивает историю команд и редактирование ввода с клавиатуры. - Новая опция позволяет избежать записи комментариев заголовков в сгенерированных файлах миграции. Эта опция также доступна для
.
makemigrations --no-header
squashmigrations
runserver
теперь можно использовать Watchman для повышения производительности отслеживания изменений большого количества файлов.
Миграции ¶
- Новая опция печатает список операций миграции, которые будут выполнены.
migrate --plan
NoneType
теперь можно сериализовать в миграциях.- Теперь вы можете зарегистрировать пользовательские сериализаторы для миграций.
Модели ¶
- Добавлена поддержка классов операторов PostgreSQL (
Index.opclasses
). - Добавлена поддержка частичных индексов (
Index.condition
). - Добавлены функции базы данных
NullIf
иReverse
, а также многие математические функции базы данных . - Установка нового
ignore_conflicts
параметра вQuerySet.bulk_create()
значениеTrue
указывает базе данных игнорировать ошибки при вставке строк, которые не соответствуют ограничениям уникальности или другим проверкам. - Новая
ExtractIsoYear
функция извлекает годы нумерации недель ISO-8601 изDateField
иDateTimeField
, а новыйiso_year
поиск позволяет выполнять запросы по годам нумерации недель ISO-8601. - Новый
QuerySet.bulk_update()
метод позволяет эффективно обновлять определенные поля на нескольких экземплярах модели. - Джанго больше не всегда начинает транзакцию , когда один запрос выполняется, например
Model.save()
,QuerySet.update()
иModel.delete()
. Это повышает производительность автоматической фиксации за счет уменьшения количества циклических обращений к базе данных. - Добавлена поддержка SQLite для
StdDev
иVariance
функций. - В класс
DISTINCT
добавлена обработка агрегацииAggregate
. Добавление в качестве атрибута класса в подклассы позволяет указать аргумент ключевого слова при инициализации, чтобы гарантировать, что агрегатная функция вызывается только для каждого отдельного значения .allow_distinct = True
Aggregate
distinct
expressions
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
, Иupdate_or_create()
методы теперь позволены на многие-ко-многим с промежуточными моделями. Новыйthrough_defaults
аргумент используется для указания значений для новых промежуточных экземпляров модели.
Запросы и ответы ¶
- Добавлено,
HttpRequest.headers
чтобы разрешить простой доступ к заголовкам запроса.
Сериализация ¶
- Теперь вы можете десериализовать данные, используя естественные ключи, содержащие прямые ссылки, путем перехода
handle_forward_references=True
кserializers.deserialize()
. Кроме того,loaddata
автоматически обрабатывает прямые ссылки.
Тесты ¶
- Новое
SimpleTestCase.assertURLEqual()
утверждение проверяет данный URL, игнорируя порядок строки запроса.assertRedirects()
использует новое утверждение. - Теперь тест
Client
поддерживает автоматическую сериализацию JSON списка и кортежа,data
когдаcontent_type='application/json'
. - Новая
ORACLE_MANAGED_FILES
настройка тестовой базы данных позволяет использовать табличные пространства Oracle Managed Files (OMF). - Отложенные ограничения базы данных теперь проверяются в конце каждого
TestCase
теста на SQLite 3.20+, как и на других серверных ВМ, поддерживающих откладываемые ограничения. Эти проверки не реализованы для старых версий SQLite, потому что они потребовали бы там дорогостоящего самоанализа таблиц. DiscoverRunner
теперь пропускает настройку баз данных, на которые не ссылаются тесты .
URL-адреса ¶
- Новый
ResolverMatch.route
атрибут хранит маршрут соответствующего шаблона URL.
Валидаторы ¶
MaxValueValidator
,MinValueValidator
,MinLengthValidator
, ИMaxLengthValidator
теперь принимает вызываемыйlimit_value
.
Backwards несовместимые изменения в 2.2 ¶
API серверной части базы данных ¶
В этом разделе описаны изменения, которые могут потребоваться в сторонних серверах баз данных.
- Сторонние серверные части баз данных должны реализовывать поддержку ограничений проверки таблиц или иметь
DatabaseFeatures.supports_table_check_constraints
значениеFalse
. - Третья В качестве базы данных партии должна осуществлять поддержку игнорируя ограничение или уникальность ошибок при вставке или набора
DatabaseFeatures.supports_ignore_conflicts
дляFalse
. - Третьи В качестве базы данных партии должны осуществлять самоанализ для
DurationField
или набораDatabaseFeatures.can_introspect_duration_field
вFalse
. DatabaseFeatures.uses_savepoints
теперь по умолчаниюTrue
.- Сторонние серверные части баз данных должны реализовывать поддержку частичных индексов или иметь
DatabaseFeatures.supports_partial_indexes
значениеFalse
. DatabaseIntrospection.table_name_converter()
иcolumn_name_converter()
удаляются. Вместо этого, возможно, потребуется внедрить сторонние серверные части баз данныхDatabaseIntrospection.identifier_converter()
. В этом случаеDatabaseIntrospection.get_constraints()
возвращаемые имена ограничений должны быть нормализованы наidentifier_converter()
.- Генерация SQL для индексов перенесена из
Index
вSchemaEditor
иSchemaEditor
добавлены следующие методы:_create_primary_key_sql()
а также_delete_primary_key_sql()
_delete_index_sql()
(чтобы соединиться с_create_index_sql()
)_delete_unique_sql
(чтобы соединиться с_create_unique_sql()
)_delete_fk_sql()
(чтобы соединиться с_create_fk_sql()
)_create_check_sql()
а также_delete_check_sql()
- Третий аргумент
DatabaseWrapper.__init__()
,allow_thread_sharing
, удаляется.
Действия администратора больше не собираются из базовых ModelAdmin
классов ¶
Например, в более старых версиях Django:
from django.contrib import admin
class BaseAdmin(admin.ModelAdmin):
actions = ['a']
class SubAdmin(BaseAdmin):
actions = ['b']
SubAdmin
были бы действия 'a'
и 'b'
.
Теперь actions
следует стандартное наследование Python. Чтобы получить тот же результат, что и раньше:
class SubAdmin(BaseAdmin):
actions = BaseAdmin.actions + ['b']
django.contrib.gis
¶
- Прекращена поддержка GDAL 1.9 и 1.10.
TransactionTestCase
загрузка сериализованных данных ¶
Начальные миграции данных теперь загружаются в
TransactionTestCase
конце теста, после сброса базы данных. В более старых версиях эти данные загружались в начале теста, но это мешает правильной работе опции (база данных была пустой в конце всего набора тестов). Это изменение не должно повлиять на ваши тесты, если вы не настроили
внутренние компоненты.test --keepdb
TransactionTestCase
sqlparse
требуется зависимость ¶
Чтобы упростить некоторые части работы с базой данных Django, теперь обязательной зависимостью является sqlparse 0.2.2+ . Он автоматически устанавливается вместе с Django.
cached_property
псевдонимы ¶
В использовании как:
from django.utils.functional import cached_property
class A:
@cached_property
def base(self):
return ...
alias = base
alias
не кешируется. Там, где проблема может быть обнаружена (Python 3.6 и новее), такое использование теперь вызываетTypeError: Cannot assign the same
cached_property to two different names ('base' and 'alias').
Используйте вместо этого:
import operator
class A:
...
alias = property(operator.attrgetter('base'))
Разрешения для прокси-моделей ¶
Разрешения для прокси-моделей теперь создаются с использованием типа содержимого прокси-модели, а не типа содержимого конкретной модели. Миграция обновит существующие разрешения при запускеmigrate
.
В админке изменение прозрачно для прокси-моделей, у которых такая же,
app_label
как у их конкретной модели. Однако в более старых версиях пользователи с разрешениями для модели прокси с другой, app_label
чем ее конкретная модель, не могли получить доступ к модели в администраторе. Теперь это исправлено, но вы можете захотеть проверить назначения разрешений для таких прокси-моделей ( [add|view|change|delete]_myproxy
) перед обновлением, чтобы убедиться, что новый доступ является подходящим.
Наконец, строки разрешений модели прокси должны быть обновлены, чтобы использовать их собственные
app_label
. Например, для app.MyProxyModel
наследования от
other_app.ConcreteModel
обновите
user.has_perm('other_app.add_myproxymodel')
до
user.has_perm('app.add_myproxymodel')
.
Объединение Media
активов формы ¶
Media
Активы формы теперь объединяются с использованием алгоритма топологической сортировки, поскольку старый алгоритм попарного объединения в некоторых случаях недостаточен. Файлы CSS и JavaScript, которые не включают их зависимости, теперь могут быть неправильно отсортированы (когда старый алгоритм по совпадению давал правильные результаты).
Проверьте все Media
классы на предмет отсутствующих зависимостей. Например, виджеты в зависимости от django.jQuery
должны указываться
при объявлении медиаресурсов формы .js=['admin/js/jquery.init.js', ...]
Разное ¶
Для удобства чтения в
UUIDField
поле формы теперь отображаются значения с тире, например550e8400-e29b-41d4-a716-446655440000
вместо550e8400e29b41d4a716446655440000
.В SQLite,
PositiveIntegerField
иPositiveSmallIntegerField
теперь включите ограничение проверки, чтобы предотвратить отрицательные значения в базе данных. Если у вас есть недопустимые данные и вы выполняете миграцию, которая воссоздает таблицу, вы увидите .CHECK constraint failed
Для согласованности с серверами WSGI тестовый клиент теперь устанавливает
Content-Length
заголовок в виде строки, а не целого числа.Возвращаемое значение
django.utils.text.slugify()
больше не помечается как безопасное для HTML.Символ усечения умолчанию , используемый
urlizetrunc
,truncatechars
,truncatechars_html
,truncatewords
, иtruncatewords_html
шаблонные фильтры теперь реальное многоточие символ (…
) вместо 3 точки. Возможно, вам придется адаптировать некоторые сравнения результатов тестов.Поддержка путей байтов в загрузчике файловой системы шаблонов удалена.
django.utils.http.urlsafe_base64_encode()
теперь возвращает строку вместо строки байтов, и ейdjango.utils.http.urlsafe_base64_decode()
больше нельзя передавать строку байтов.Поддержка
cx_Oracle
<6.0 удалена.Минимальная поддерживаемая версия
mysqlclient
увеличена с 1.3.7 до 1.3.13.Минимальная поддерживаемая версия SQLite увеличена с 3.7.15 до 3.8.3.
В попытке обеспечить более семантические данные запроса, в
NullBooleanSelect
настоящее время оказывает<option>
значенияunknown
,true
иfalse
вместо того1
,2
и3
. Для обратной совместимости старые значения по-прежнему принимаются как данные.Group.name
max_length
увеличен с 80 до 150 знаков.Тесты, нарушающие отложенные ограничения базы данных, теперь выдают ошибку при запуске на SQLite 3.20+, как и на других серверных ВМ, поддерживающих такие ограничения.
Чтобы отловить ошибки использования, test
Client
anddjango.utils.http.urlencode()
now raiseTypeError
ifNone
передается как значение для кодирования, посколькуNone
не может быть закодировано в данных GET и POST. Либо передайте пустую строку, либо опустите значение.Команда
ping_google
управления теперь по умолчанию используетсяhttps
вместоhttp
URL-адреса карты сайта. Если ваш сайт использует http, используйте новую опцию. Если вы используете функцию, установите для нового аргумента значение .ping_google --sitemap-uses-http
ping_google()
sitemap_uses_https
False
runserver
больше не поддерживаетpyinotify
(заменен на Watchman).Avg
,StdDev
ИVariance
агрегатные функции в настоящее время возвращаютDecimal
вместоfloat
когда входDecimal
.Тесты на SQLite не пройдут, если приложения без миграции связаны с приложениями с миграциями. Это ограничение было задокументировано с тех пор, как в Django 1.7 были добавлены миграции, но теперь оно перестает работать более надежно. Вы увидите, что тесты завершаются с ошибками, например . Это наблюдалось с несколькими сторонними приложениями, модели которых тестировались без миграции. Для таких моделей необходимо добавить миграции.
no such table: <app_label>_<model>
Предоставление целого числа в
key
аргументе оператораcache.delete()
orcache.get()
now вызываетValueError
.Формулы множественного числа для некоторых языков изменены, поскольку включены последние версии Transifex.
Примечание
В
.po
Django 2.2.12 была добавлена возможность обрабатывать файлы, содержащие разные уравнения множественного числа для одного и того же языка.
Функции, устаревшие в версии 2.2 ¶
Модель Meta.ordering
больше не будет влиять на запросы ¶GROUP BY
Запросы, Meta.ordering
влияющие на модель (например,
), являются частым источником путаницы. Такие запросы теперь выдают предупреждение об устаревании с советом добавить, чтобы сохранить текущий запрос. будут игнорироваться в таких запросах, начиная с Django 3.1.GROUP BY
.annotate().values()
order_by()
Meta.ordering
Разное ¶
django.utils.timezone.FixedOffset
устарел в пользуdatetime.timezone
.- Недокументированный
QuerySetPaginator
псевдонимdjango.core.paginator.Paginator
устарел. - В
FloatRangeField
модели и поле формы вdjango.contrib.postgres
осуждается в пользу нового имениDecimalRangeField
, чтобы соответствовать основномуnumrange
типу данных , используемому в базе данных. - Эта
FILE_CHARSET
настройка устарела. Начиная с Django 3.1 файлы, считываемые с диска, должны быть в кодировке UTF-8. django.contrib.staticfiles.storage.CachedStaticFilesStorage
устарел из-за неразрешимых проблем. ИспользуйтеManifestStaticFilesStorage
или стороннее облако хранение вместо этого.RemoteUserBackend.configure_user()
теперь передаетсяrequest
как первый позиционный аргумент, если он его принимает. Поддержка переопределений, которые ее не принимают, будет удалена в Django 3.1.SimpleTestCase.allow_database_queries
,TransactionTestCase.multi_db
ИTestCase.multi_db
атрибуты являются устаревшими в пользуSimpleTestCase.databases
,TransactionTestCase.databases
иTestCase.databases
. Эти новые атрибуты позволяют объявлять зависимости баз данных, чтобы предотвратить неожиданные запросы к базам данных, отличным от используемых по умолчанию, для утечки состояния между тестами. Предыдущее поведениеallow_database_queries=True
иmulti_db=True
может быть достигнуто установкойdatabases='__all__'
.