Примечания к выпуску 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.gis

  • Добавлена ​​поддержка Oracle для Envelopeфункции.
  • Добавлена поддержка SpatiaLite для coveredbyи covers поиска.

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-headersquashmigrations
  • runserverтеперь можно использовать Watchman для повышения производительности отслеживания изменений большого количества файлов.

Миграции

Модели

  • Добавлена ​​поддержка классов операторов 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 = TrueAggregatedistinctexpressions
  • 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.

Валидаторы

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 --keepdbTransactionTestCase

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 Clientand django.utils.http.urlencode()now raise TypeErrorif Noneпередается как значение для кодирования, поскольку Noneне может быть закодировано в данных GET и POST. Либо передайте пустую строку, либо опустите значение.

  • Команда ping_googleуправления теперь по умолчанию используется https вместо httpURL-адреса карты сайта. Если ваш сайт использует http, используйте новую опцию. Если вы используете функцию, установите для нового аргумента значение .ping_google --sitemap-uses-httpping_google()sitemap_uses_httpsFalse

  • runserverбольше не поддерживает pyinotify(заменен на Watchman).

  • Avg, StdDevИ Varianceагрегатные функции в настоящее время возвращают Decimalвместо floatкогда вход Decimal.

  • Тесты на SQLite не пройдут, если приложения без миграции связаны с приложениями с миграциями. Это ограничение было задокументировано с тех пор, как в Django 1.7 были добавлены миграции, но теперь оно перестает работать более надежно. Вы увидите, что тесты завершаются с ошибками, например . Это наблюдалось с несколькими сторонними приложениями, модели которых тестировались без миграции. Для таких моделей необходимо добавить миграции.no such table: <app_label>_<model>

  • Предоставление целого числа в keyаргументе оператора cache.delete()or cache.get()now вызывает ValueError.

  • Формулы множественного числа для некоторых языков изменены, поскольку включены последние версии Transifex.

    Примечание

    В .poDjango 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__'.

Copyright ©2021 All rights reserved