Примечания к выпуску Django 2.0

2 декабря 2017 г.

Добро пожаловать в Django 2.0!

Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.11 или более ранней версии. Мы отказались от некоторых функций , срок действия которых подошел к концу, и мы начали процесс прекращения поддержки некоторых функций .

В этом выпуске Django начинает использовать свободную форму семантического управления версиями , но никаких серьезных обратно несовместимых изменений, которые можно было бы ожидать от выпуска 2.0, не произошло. Обновление должно быть таким же трудоемким, как и предыдущие выпуски функций.

См. Руководство по обновлению Django до более новой версии, если вы обновляете существующий проект.

Совместимость с Python

Django 2.0 поддерживает Python 3.4, 3.5, 3.6 и 3.7. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.

Серия Django 1.11.x - последняя, ​​поддерживающая Python 2.7.

Django 2.0 будет последней серией выпусков, поддерживающих Python 3.4. Если вы планируете развертывание Python 3.4 после окончания жизненного цикла Django 2.0 (апрель 2019 г.), вместо этого придерживайтесь Django 1.11 LTS (поддерживается до апреля 2020 г.). Однако обратите внимание, что срок службы Python 3.4 истечет в марте 2019 года.

Поддержка сторонних библиотек для более старой версии Django

После выпуска Django 2.0 мы предлагаем сторонним авторам приложений отказаться от поддержки всех версий Django до 1.11. В то время вы должны иметь возможность запускать тесты вашего пакета, чтобы появлялись предупреждения об устаревании. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 2.0.python -Wd

Что нового в Django 2.0

Упрощенный синтаксис маршрутизации URL

Новая django.urls.path()функция позволяет использовать более простой и понятный синтаксис маршрутизации URL-адресов. Например, этот пример из предыдущих выпусков Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

можно было бы записать как:

path('articles/<int:year>/', views.year_archive),

Новый синтаксис поддерживает приведение типов параметров URL. В этом примере представление получит yearаргумент ключевого слова как целое число, а не как строку. Кроме того, URL-адреса, которые будут соответствовать, немного менее ограничены в перезаписанном примере. Например, 10000 год теперь будет соответствовать, поскольку целые числа года не ограничены точностью до четырех цифр, как в регулярном выражении.

django.conf.urls.url()Функция из предыдущих версий теперь доступна django.urls.re_path(). Старое расположение остается для обратной совместимости без неминуемого прекращения поддержки. Старая django.conf.urls.include()функция теперь может быть импортирована из, django.urls поэтому вы можете использовать ее в своих URLconfs.from django.urls import include, path, re_path

Документ диспетчера URL-адресов переписан с учетом нового синтаксиса и более подробной информации.

Мобильный дружественных contrib.admin

Администратор теперь реагирует и поддерживает все основные мобильные устройства. Старые браузеры могут испытывать различные уровни постепенной деградации.

Оконные выражения

Новое Windowвыражение позволяет добавлять OVERпредложение в наборы запросов. В выражении можно использовать оконные функции и агрегатные функции .

Незначительные особенности

django.contrib.admin

django.contrib.auth

  • Счетчик итераций по умолчанию для хешера паролей PBKDF2 увеличен с 36 000 до 100 000.

django.contrib.gis

  • Добавлена ​​поддержка MySQL для AsGeoJSONфункции, GeoHashфункции, IsValidфункции, isvalidпоиска и поиска расстояния .
  • Добавлены Azimuthи LineLocatePointфункции, поддерживаемые на PostGIS и SpatiaLite.
  • Для любого GEOSGeometryимпортированного из GeoJSON теперь установлен SRID.
  • Добавлен OSMWidget.default_zoomатрибут для настройки уровня масштабирования карты по умолчанию.
  • Сделаны метаданные для чтения и редактирования на растрах через metadata, infoи metadataатрибуты.
  • Разрешена передача параметров создания конкретного драйвера GDALRasterобъектам, использующим papsz_options.
  • Разрешено создание GDALRasterобъектов во внутренней виртуальной файловой системе GDAL. Теперь растры можно создавать и преобразовывать в двоичные данные в памяти.
  • Новый GDALBand.color_interp()метод возвращает цветовую интерпретацию полосы.

django.contrib.postgres

  • Новый distinctаргумент для ArrayAggопределяет, будут ли объединенные значения отличаться друг от друга.
  • Новая RandomUUIDфункция базы данных возвращает UUID версии 4. Это требует использования pgcryptoрасширения PostgreSQL, которое можно активировать с помощью новой CryptoExtensionоперации миграции.
  • django.contrib.postgres.indexes.GinIndexтеперь поддерживает fastupdateи gin_pending_list_limitпараметры.
  • Новый GistIndexкласс позволяет создавать GiSTиндексы в базе данных. Новая BtreeGistExtensionоперация миграции устанавливает btree_gistрасширение, чтобы добавить поддержку для классов операторов, которые не являются встроенными.
  • inspectdbтеперь может самоанализ JSONFieldи различные RangeFields ( django.contrib.postgresдолжны быть в INSTALLED_APPS).

django.contrib.sitemaps

  • В конструктор добавлен protocolаргумент ключевого слова GenericSitemap.

Кэш

  • cache.set_many()теперь возвращает список ключей, которые не удалось вставить. Для встроенных серверных модулей неудачные вставки могут происходить только в memcached.

Файловое хранилище

  • File.open()может использоваться как менеджер контекста, например .with file.open() as f:

Формы

  • Новые date_attrsи time_attrsаргументы для SplitDateTimeWidgetи SplitHiddenDateTimeWidgetпозволяют указывать различные атрибуты HTML для DateInputи TimeInput(или скрытых) подвиджетов.
  • Новый Form.errors.get_json_data()метод возвращает ошибки формы в виде словаря, подходящего для включения в ответ JSON.

Общие представления

Команды управления

  • inspectdbтеперь переводит беззнаковые целочисленные столбцы MySQL в PositiveIntegerFieldили PositiveSmallIntegerField.
  • Новая опция управляет форматом комментариев в файлах PO.makemessages --add-location
  • loaddataтеперь можно читать из стандартного ввода .
  • Новая опция позволяет отформатировать вывод в едином формате сравнения.diffsettings --output
  • В Oracle inspectdbтеперь можно самоанализировать AutoField, создан ли столбец как столбец идентификации.
  • В MySQL dbshellтеперь поддерживаются сертификаты TLS на стороне клиента.

Миграции

Модели

  • Новая StrIndexфункция базы данных находит начальный индекс строки внутри другой строки.
  • В Oracle AutoFieldи BigAutoFieldтеперь создаются как столбцы идентификации .
  • Новый chunk_sizeпараметр QuerySet.iterator()контролирует количество строк, извлекаемых клиентом базы данных Python при потоковой передаче результатов из базы данных. Для баз данных, которые не поддерживают курсоры на стороне сервера, он контролирует количество результатов, которые Django извлекает из адаптера базы данных.
  • QuerySet.earliest(),, QuerySet.latest()и Meta.get_latest_byтеперь позволяют упорядочивать по нескольким полям.
  • Добавлена ExtractQuarterфункция для извлечения четверти из DateFieldи DateTimeFieldи представлена ​​через quarterпоиск.
  • Добавлена TruncQuarterфункция усечения DateFieldи DateTimeFieldпервого дня квартала.
  • Добавлен db_tablespaceпараметр в индексы на основе классов.
  • Если база данных поддерживает собственное поле продолжительности (Oracle и PostgreSQL), Extractтеперь работает с DurationField.
  • Добавлен ofаргумент QuerySet.select_for_update(), поддерживаемый в PostgreSQL и Oracle, для блокировки только строк из определенных таблиц, а не всех выбранных таблиц. Это может быть полезно, особенно когда select_for_update()используется вместе с select_related().
  • Новый field_nameпараметр QuerySet.in_bulk()позволяет получать результаты на основе любого уникального поля модели.
  • CursorWrapper.callproc()теперь принимает необязательный словарь параметров ключевых слов, если бэкэнд поддерживает эту функцию. Из встроенных серверных модулей Django только Oracle поддерживает его.
  • Новый connection.execute_wrapper()метод позволяет устанавливать оболочки вокруг выполнения запросов к базе данных .
  • Новый filterаргумент для встроенных агрегатов позволяет добавлять разные условные выражения к множеству агрегатов по одним и тем же полям или отношениям.
  • Добавлена ​​поддержка выражений в Meta.ordering.
  • Новый namedпараметр QuerySet.values_list()позволяет получать результаты в виде именованных кортежей.
  • Новый FilteredRelationкласс позволяет добавлять ONпредложение в наборы запросов.

Пагинация

  • Добавлен Paginator.get_page() для обеспечения документированного шаблона обработки неверных номеров страниц.

Запросы и ответы

  • В runserverподдерживает веб - сервер HTTP 1.1.

Шаблоны

  • Чтобы повысить полезность Engine.get_default()сторонних приложений, теперь он возвращает первый движок, если DjangoTemplatesнастроено несколько движков, TEMPLATESа не поднимается ImproperlyConfigured.
  • Пользовательские теги шаблонов теперь могут принимать аргументы, содержащие только ключевые слова.

Тесты

Валидаторы

  • Новое ProhibitNullCharactersValidatorзапрещает нулевой символ во вводе поля CharFieldформы и его подклассов. Инструменты сканирования уязвимостей наблюдали ввод нулевого символа. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ вызывает исключение при попытке сохранить нулевой символ в поле типа char / text с PostgreSQL.

Обратно несовместимые изменения в 2.0

Удалена поддержка байтовых строк в некоторых местах

Для поддержки собственных строк Python 2 более старые версии Django должны были принимать как строки байтов, так и строки Unicode. Теперь, когда поддержка Python 2 прекращена, байтовые строки должны встречаться только вокруг границ ввода / вывода (например, обработка двоичных полей или HTTP-потоков). Возможно, вам придется обновить свой код, чтобы ограничить использование байтовых строк до минимума, поскольку Django больше не принимает байтовые строки в определенных путях кода. -bОпция Python может помочь обнаружить эту ошибку в вашем коде.

Например, reverse()теперь str()вместо force_text()принуждения используется, argsи kwargsон получает до их размещения в URL-адресе. Для байтовых строк это создает строку с нежелательным bпрефиксом, а также дополнительные кавычки ( str(b'foo')есть "b'foo'"). Для адаптации вызовите decode()байтовую строку перед ее передачей в reverse().

API серверной части базы данных

В этом разделе описаны изменения, которые могут потребоваться в сторонних серверах баз данных.

  • DatabaseOperations.datetime_cast_date_sql(), datetime_cast_time_sql(), datetime_trunc_sql(), datetime_extract_sql(), И date_interval_sql()методы теперь возвращают только SQL для выполнения операции вместо SQL и список параметров.
  • Сторонние серверные части баз данных должны добавить DatabaseWrapper.display_name атрибут с именем базы данных, с которой работает ваш сервер. Django может использовать его в различных сообщениях, например, при проверке системы.
  • Первый аргумент SchemaEditor._alter_column_type_sql()- это сейчас, modelа не table.
  • Первый аргумент SchemaEditor._create_index_name()- это сейчас, table_nameа не model.
  • Чтобы включить поддержку, установите . Если база данных требует, чтобы аргументы были столбцами, а не таблицами, установите .FOR UPDATE OFDatabaseFeatures.has_select_for_update_of = TrueOFDatabaseFeatures.select_for_update_of_column = True
  • Чтобы включить поддержку Window выражений, установите DatabaseFeatures.supports_over_clauseзначение True. Возможно, вам потребуется настроить методы DatabaseOperations.window_start_rows_start_end() и / или window_start_range_start_end().
  • Сторонние серверные части базы данных должны добавить DatabaseOperations.cast_char_field_without_max_lengthатрибут с типом данных базы данных, который будет использоваться в Castфункции для a, CharFieldесли max_lengthаргумент не указан.
  • Первым аргументом DatabaseCreation._clone_test_db()и get_test_db_clone_settings()является now, suffixа не number(в случае, если вы хотите переименовать подписи в вашем бэкэнде для единообразия). django.testтакже теперь передает эти значения как строки, а не как целые числа.
  • Сторонние серверные части баз данных должны добавить DatabaseIntrospection.get_sequences()метод, основанный на заглушке в BaseDatabaseIntrospection.

Прекращена поддержка Oracle 11.2

Окончание восходящей поддержки Oracle 11.2 - декабрь 2020 г. Django 1.11 будет поддерживаться до апреля 2020 г., который почти достигает этой даты. Django 2.0 официально поддерживает Oracle 12.1+.

Уровень изоляции MySQL по умолчанию - чтение зафиксировано

Уровень изоляции MySQL по умолчанию, повторяющееся чтение, может вызвать потерю данных при типичном использовании Django. Чтобы предотвратить это и обеспечить согласованность с другими базами данных, уровень изоляции по умолчанию теперь считается подтвержденным. При необходимости вы можете использовать этот DATABASESпараметр, чтобы использовать другой уровень изоляции .

AbstractUser.last_name max_lengthувеличена до 150

Перенос для django.contrib.auth.models.User.last_nameвключен. Если у вас есть настраиваемая пользовательская модель, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей пользовательской модели.

Если вы хотите сохранить ограничение в 30 символов для фамилий, используйте настраиваемую форму:

from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    last_name = forms.CharField(max_length=30, required=False)

Если вы хотите сохранить это ограничение в админке при редактировании пользователей, установите UserAdmin.formдля использования эту форму:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

QuerySet.reverse()и last()запрещены после нарезки

Вызов QuerySet.reverse()или last()на срезанном наборе запросов приводит к неожиданным результатам из-за применения среза после переупорядочения. Сейчас это запрещено, например:

>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.

Поля формы больше не принимают необязательные аргументы в качестве позиционных аргументов

Чтобы предотвратить ошибки времени выполнения из-за неправильного порядка аргументов полей формы, необязательные аргументы встроенных полей формы больше не принимаются в качестве позиционных аргументов. Например:

forms.IntegerField(25, 10)

вызывает исключение и должно быть заменено на:

forms.IntegerField(max_value=25, min_value=10)

call_command()проверяет полученные параметры

call_command()теперь проверяет, что синтаксический анализатор аргументов вызываемой команды определяет все переданные параметры call_command().

Для настраиваемых команд управления, которые используют параметры, не созданные с помощью parser.add_argument(), добавьте stealth_optionsатрибут в команду:

class MyCommand(BaseCommand):
    stealth_options = ('option_name', ...)

Индексы больше не принимают позиционные аргументы

Например:

models.Index(['headline', '-pub_date'], 'index_name')

вызывает исключение и должно быть заменено на:

models.Index(fields=['headline', '-pub_date'], name='index_name')

Ограничения внешнего ключа теперь включены в SQLite

Это будет отображаться как обратная несовместимость change ( ) при попытке сохранить существующий экземпляр модели, который нарушает ограничение внешнего ключа.IntegrityError: FOREIGN KEY constraint failed

Внешние ключи теперь создаются с использованием вместо . Таким образом, может потребоваться перестройка таблиц для воссоздания внешних ключей с новым определением, особенно если вы используете такой шаблон:DEFERRABLE INITIALLY DEFERREDDEFERRABLE IMMEDIATE

from django.db import transaction

with transaction.atomic():
    Book.objects.create(author_id=1)
    Author.objects.create(id=1)

Если вы не воссоздадите внешний ключ как DEFERRED, первый create() не удастся теперь, когда ограничения внешнего ключа применяются.

Сначала сделайте резервную копию своей базы данных! После обновления до Django 2.0 вы можете перестроить таблицы, используя сценарий, подобный этому:

from django.apps import apps
from django.db import connection

for app in apps.get_app_configs():
    for model in app.get_models(include_auto_created=True):
        if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
            for base in model.__bases__:
                if hasattr(base, '_meta'):
                    base._meta.local_many_to_many = []
            model._meta.local_many_to_many = []
            with connection.schema_editor() as editor:
                editor._remake_table(model)

Этот скрипт не прошел тщательного тестирования и нуждается в адаптации для различных случаев, например для нескольких баз данных. Не стесняйтесь вносить улучшения.

Кроме того, из - за стола переделки ограничения SQLite, это запрещено выполнять RenameModelи RenameFieldоперации на модели или поля , на которые ссылается другими моделями в сделке. Чтобы разрешить применение миграций, содержащих эти операции, вы должны установить для Migration.atomicатрибута значение False.

Разное

  • SessionAuthenticationMiddlewareКласс удаляется. Он не предоставлял никаких функций, поскольку аутентификация сеанса безусловно включена в Django 1.10.

  • Обработчики ошибок HTTP по умолчанию ( handler404и т. Д.) Теперь являются вызываемыми вместо строк пути Python с точками. Django отдает предпочтение вызываемым ссылкам, поскольку они обеспечивают лучшую производительность и удобство отладки.

  • RedirectViewбольше не заглушает, NoReverseMatchесли pattern_nameне существует.

  • Когда USE_L10Nвыключен, FloatFieldа DecimalFieldтеперь уважаю DECIMAL_SEPARATOR и THOUSAND_SEPARATORво время валидации. Например, с настройками:

    USE_L10N = False
    USE_THOUSAND_SEPARATOR = True
    DECIMAL_SEPARATOR = ','
    THOUSAND_SEPARATOR = '.'
    

    "1.345"теперь ввод преобразуется в 1345вместо 1.345.

  • Подклассы AbstractBaseUserбольше не требуются для реализации get_short_name()и get_full_name(). (Базовые реализации, которые вызывают повышение NotImplementedError, удаляются.) django.contrib.adminИспользует эти методы, если они реализованы, но не требует их. Сторонние приложения, использующие эти методы, могут захотеть применить аналогичный подход.

  • FIRST_DAY_OF_WEEKИ NUMBER_GROUPINGнастройка формата теперь хранятся в виде целых чисел в JavaScript и JSON просмотреть i18n выходов.

  • assertNumQueries()теперь игнорирует запросы конфигурации подключения. Раньше, если тест открывал новое соединение с базой данных, эти запросы могли быть включены как часть assertNumQueries()подсчета.

  • Размер по умолчанию тестового табличного пространства Oracle увеличен с 20M до 50M, а размер авторасширения по умолчанию увеличен с 10M до 25M.

  • Чтобы повысить производительность при потоковой передаче больших наборов результатов из базы данных, QuerySet.iterator()теперь выбирает 2000 строк за раз вместо 100. Старое поведение можно восстановить с помощью chunk_sizeпараметра. Например:

    Book.objects.iterator(chunk_size=100)
    
  • Предоставление неизвестных имен пакетов в packagesаргументе JavaScriptCatalogпредставления теперь возникает ValueError вместо передачи без уведомления.

  • Первичный ключ экземпляра модели теперь отображается в Model.__str__() методе по умолчанию , например .Question object (1)

  • makemigrationsтеперь обнаруживает изменения в limit_choices_to опции поля модели . Добавьте это к своим существующим миграциям или примите автоматически созданную миграцию для полей, которые его используют.

  • Выполнение запросов, требующих автоматических пространственных преобразований, теперь возникает NotImplementedError в MySQL, вместо того, чтобы молча использовать непреобразованные геометрии.

  • django.core.exceptions.DjangoRuntimeWarningустранен. Он использовался только в бэкэнде кеша как промежуточный класс в CacheKeyWarningнаследовании RuntimeWarning.

  • Переименован BaseExpression._output_fieldв output_field. Возможно, вам потребуется обновить пользовательские выражения.

  • В более старых версиях формы и наборы форм объединяют их Mediaс виджетами, объединяя их Media. Комбинирование теперь пытается сохранить относительный порядок элементов в каждом списке . MediaOrderConflictWarningвыдается, если заказ не может быть сохранен.

  • django.contrib.gis.gdal.OGRExceptionустранен. Это псевдоним GDALExceptionс Django 1.8.

  • Поддержка GEOS 3.3.x прекращена.

  • Способ выбора данных GeometryFieldизменен для повышения производительности, и в необработанных SQL-запросах эти поля теперь должны быть заключены в оболочку connection.ops.select. См. Пример в примечании « Необработанные запросы» в руководстве по ГИС.

Функции, устаревшие в версии 2.0

contextаргумент Field.from_db_value()и Expression.convert_value()

contextАргумент Field.from_db_value()и Expression.convert_value()не используется , поскольку это всегда пустой словарь. Сигнатура обоих методов теперь:

(self, value, expression, connection)

вместо:

(self, value, expression, connection, context)

Поддержка старой подписи в настраиваемых полях и выражениях сохраняется до Django 3.0.

Разное

  • django.db.backends.postgresql_psycopg2Модуль является устаревшим в пользу django.db.backends.postgresql. Это псевдоним с Django 1.9. Это влияет только на код, который напрямую импортируется из модуля. Этот DATABASESпараметр все еще можно использовать 'django.db.backends.postgresql_psycopg2', хотя вы можете упростить его, используя 'django.db.backends.postgresql'имя, добавленное в Django 1.9.
  • django.shortcuts.render_to_response()устарел в пользу django.shortcuts.render(). render()принимает те же аргументы, за исключением того, что также требует request.
  • Эта DEFAULT_CONTENT_TYPEнастройка устарела. Он плохо взаимодействует со сторонними приложениями и устарел, поскольку HTML5 в основном вытеснил XHTML.
  • HttpRequest.xreadlines() устарел в пользу повторения запроса.
  • field_nameКлючевое слово аргумента QuerySet.earliest()и QuerySet.latest()осуждаются в пользу прохождения имен полей в качестве аргументов. Пишите .earliest('pub_date')вместо .earliest(field_name='pub_date').

Функции, удаленные в 2.0

Эти функции достигли конца цикла устаревания и удалены в Django 2.0.

Подробную информацию об этих изменениях, в том числе о том, как отменить использование этих функций, см. В разделе « Функции, не рекомендуемые в версии 1.9» .

  • weakАргумент django.dispatch.signals.Signal.disconnect()удаляется.
  • django.db.backends.base.BaseDatabaseOperations.check_aggregate_support() устранен.
  • django.forms.extrasПакет удаляется.
  • assignment_tagПомощник удаляется.
  • hostАргумент SimpleTestCase.assertsRedirects()удаляется. Уровень совместимости, позволяющий считать абсолютные URL-адреса равными относительным, когда путь идентичен, также удаляется.
  • Field.relи Field.remote_field.toудаляются.
  • on_deleteАргумент ForeignKeyи OneToOneFieldтеперь требуется в моделях и миграции. Рассмотрите возможность отказа от миграций, чтобы у вас было меньше их для обновления.
  • django.db.models.fields.add_lazy_relation() устранен.
  • Когда поддержка часовых поясов включена, серверные части базы данных, которые не поддерживают часовые пояса, больше не преобразуют известные значения даты и времени в наивные значения в формате UTC, когда такие значения передаются в качестве параметров SQL-запросам, выполняемым вне ORM, например, с помощью cursor.execute().
  • django.contrib.auth.tests.utils.skipIfCustomUser() устранен.
  • GeoManagerИ GeoQuerySetклассы удалены.
  • django.contrib.gis.geoipМодуль удаляется.
  • Убрана supports_recursionпроверка загрузчиков шаблонов из:
    • django.template.engine.Engine.find_template()
    • django.template.loader_tags.ExtendsNode.find_template()
    • django.template.loaders.base.Loader.supports_recursion()
    • django.template.loaders.cached.Loader.supports_recursion()
  • В load_templateи load_template_sourcesметоды шаблон погрузчика удаляются.
  • template_dirsАргумент шаблона погрузчиков удаляются:
    • django.template.loaders.base.Loader.get_template()
    • django.template.loaders.cached.Loader.cache_key()
    • django.template.loaders.cached.Loader.get_template()
    • django.template.loaders.cached.Loader.get_template_sources()
    • django.template.loaders.filesystem.Loader.get_template_sources()
  • django.template.loaders.base.Loader.__call__() устранен.
  • Поддержка настраиваемых представлений ошибок, которые не принимают exceptionпараметр, удалена.
  • mime_typeАтрибут django.utils.feedgenerator.Atom1Feedи django.utils.feedgenerator.RssFeedудаляется.
  • app_nameАргумент include()удаляется.
  • Поддержка передачи 3-кортежа (включая admin.site.urls) в качестве первого аргумента include()удалена.
  • Поддержка установки пространства имен экземпляра URL без пространства имен приложения удалена.
  • Field._get_val_from_obj() устранен.
  • django.template.loaders.eggs.Loader устранен.
  • current_appПараметр с contrib.authвидом функции на основе удаляется.
  • callable_objКлючевое слово аргумент SimpleTestCase.assertRaisesMessage()удаляется.
  • Поддержка allow_tagsатрибута в ModelAdminметодах удалена.
  • enclosureКлючевое слово аргумент SyndicationFeed.add_item()удаляется.
  • django.template.loader.LoaderOriginИ django.template.base.StringOriginпсевдонимы для django.template.base.Originудаляются.

Подробную информацию об этих изменениях см. В разделе « Функции, не рекомендуемые в версии 1.10» .

  • Вариант удаляется.makemigrations --exit
  • Удалена поддержка прямого присвоения обратному внешнему ключу или отношению «многие ко многим».
  • get_srid()И set_srid()методы django.contrib.gis.geos.GEOSGeometryудаляются.
  • get_x(), set_x(), get_y(), set_y(), get_z(), И set_z()методы django.contrib.gis.geos.Pointудаляются.
  • get_coords()И set_coords()методы django.contrib.gis.geos.Pointудаляются.
  • cascaded_unionСвойство django.contrib.gis.geos.MultiPolygon удаляется.
  • django.utils.functional.allow_lazy() устранен.
  • Вариант удаляется.shell --plain
  • django.core.urlresolversМодуль удаляется в пользу нового места, django.urls.
  • CommaSeparatedIntegerField удален, за исключением поддержки в исторических миграциях.
  • Шаблонный Context.has_key()метод удален.
  • Поддержка для django.core.files.storage.Storage.accessed_time(), created_time()и modified_time()методы удаляется.
  • Поддержка поиска по запросу с использованием имени модели, когда Meta.default_related_nameустановлено, удалена.
  • __searchПоиск в MySQL удален.
  • Прокладка для поддержки настраиваемых связанных классов менеджеров без _apply_rel_filters()метода удалена.
  • Использование User.is_authenticated()и в User.is_anonymous()качестве методов, а не свойств больше не поддерживается.
  • Model._meta.virtual_fieldsАтрибут удаляется.
  • Аргументы ключевого слова virtual_onlyin Field.contribute_to_class()и virtualin Model._meta.add_field()удаляются.
  • Представления javascript_catalog()и json_catalog()удаляются.
  • django.contrib.gis.utils.precision_wkt() устранен.
  • В многотабличном наследовании неявное преобразование a OneToOneFieldв a parent_linkудаляется.
  • Поддержка Widget._format_value()удалена.
  • FileFieldметоды get_directory_name()и get_filename()удаляются.
  • mark_for_escaping()Функции и классы , которые он использует: EscapeData, EscapeBytes, EscapeText, EscapeString, и EscapeUnicodeудаляются.
  • Теперь escapeфильтр использует django.utils.html.conditional_escape().
  • Manager.use_for_related_fields устранен.
  • ManagerНаследование модели следует правилам наследования MRO. Требование использовать Meta.manager_inheritance_from_futureдля подтверждения поведения удалено.
  • Удалена поддержка использования промежуточного программного обеспечения в старом стиле settings.MIDDLEWARE_CLASSES.

Copyright ©2021 All rights reserved