Примечания к выпуску 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). Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Что нового в Django 2.2 ¶
Ограничения ¶
Новый класс: ~ django.db.models.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
Ядра баз данных ¶
- В SQLite добавлена потоковая передача результатов для
QuerySet.iterator()
.
Общие представления ¶
- Новая точка входа
View.setup
инициализирует атрибуты представлений перед вызовомdispatch()
. Это позволяет классам миксинов настраивать атрибуты экземпляров для повторного использования в дочерних классах.
Интернационализация ¶
- Добавлена поддержка армянских переводов.
Команды администрирования ¶
- Новая опция option: –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
теперь можно сериализовать в миграциях.- Теперь можно зарегистрировать пользовательские сериализаторы для миграции.
Модели ¶
Index.opclasses
Добавлена поддержка операторов класса PostgreSQL ( ).Index.condition
Добавлена поддержка частичных индексов ( ).- Класс: ~ django.db.models.functions.NullIf и функции базы данных
Reverse
были добавлены, как и многие математические функции базы данных . - Установка нового параметра
ignore_conflicts
изQuerySet.bulk_create()
ToTrue
указывает базе данных игнорировать вставки строк, которые не проходят проверку уникальности и другие проверки. - Новая функция
ExtractIsoYear
извлекает лет с ISO-8601 номер недели отDateField
и полейDateTimeField
, и новое выражение запросаiso_year
позволяет запрашивать в соответствии год с ISO-8601 номер недели. - Новый метод
QuerySet.bulk_update()
позволяет эффективно обновлять определенные поля в нескольких экземплярах модели. - Django больше не запускает транзакцию автоматически при выполнении одного запроса, например
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
исполняемого файла.
Изменения, несовместимые со старыми версиями Django 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]_monmandataire
) перед обновлением, чтобы убедиться, что новые доступы верны.
Наконец, строки разрешений прокси-моделей должны быть обновлены, чтобы использовать их собственную метку app_label
. Например, для app.MonModeleMandataire
наследования от autre_app.ModeleConcret
обновите user.has_perm('autre_app.add_monmodelemandataire')
до user.has_perm('app.add_monmodelemandataire')
.
Объединение файлов статических 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
теперь символ «точка» Real (…
) вместо 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
. Благодаря обратной совместимости данные со старыми значениями по-прежнему принимаются.Максимальная длина
max_length
отGroup.name
была изменена от 80 до 150 символов.Тесты, которые нарушают отложенные ограничения базы данных, теперь вызывают ошибки в SQLite 3.20+, как и в других механизмах, которые также обрабатывают эти ограничения.
Чтобы отловить ошибки использования, тестовый клиент, а
Client
такжеdjango.utils.http.urlencode()
теперь выдает исключение,TypeError
еслиNone
передается как значение, которое нужно закодировать, поскольку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 была добавлена возможность обрабатывать файлы, содержащие различные уравнения множественного числа для одного и того же языка.
Функции, устаревшие в Django 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__'
.