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

  • Envelope Добавлена поддержка этой функции для Oracle.
  • Для 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

Ядра баз данных

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

Миграции

Модели

  • Index.opclasses Добавлена поддержка операторов класса PostgreSQL ( ).
  • Index.condition Добавлена поддержка частичных индексов ( ).
  • Класс: ~ django.db.models.functions.NullIf и функции базы данных Reverse были добавлены, как и многие математические функции базы данных .
  • Установка нового параметра ignore_conflicts из QuerySet.bulk_create() To True указывает базе данных игнорировать вставки строк, которые не проходят проверку уникальности и другие проверки.
  • Новая функция 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.

Валидаторы

Изменения, несовместимые со старыми версиями 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() or cache.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__' .

Copyright ©2020 All rights reserved