Примечания к выпуску Django 2.0¶
2 декабря 2017
Добро пожаловать в Django 2.0!
Эти заметки о выпуске охватывают new features, а также некоторые backwards incompatible changes, о которых вы захотите знать при переходе с Django 1.11 или более ранней версии. Мы dropped some features, которые достигли конца своего цикла устаревания, и мы begun the deprecation process for some features.
Этот выпуск начинает использование в Django символа loose form of semantic versioning, но в нем нет никаких серьезных изменений, несовместимых с обратной стороной, которые можно было бы ожидать от выпуска 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. В это время вы должны иметь возможность запускать тесты вашего пакета, используя python -Wd, чтобы предупреждения об устаревании не появлялись. После исправления предупреждений об устаревании ваше приложение должно быть совместимо с Django 2.0.
Что нового в 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, так что вы можете использовать from django.urls import include, path, re_path в ваших URLconfs.
Документ Диспетчер URL переписан с учетом нового синтаксиса и более подробной информации.
Удобный для мобильных устройств contrib.admin¶
Админка теперь отзывчивая и поддерживает все основные мобильные устройства. В старых браузерах может наблюдаться различный уровень плавной деградации.
Оконные выражения¶
Новое выражение Window позволяет добавить к кверисетам условие OVER. В выражении можно использовать window functions и aggregate functions.
Незначительные особенности¶
django.contrib.admin¶
- Новый атрибут ModelAdmin.autocomplete_fieldsи методModelAdmin.get_autocomplete_fields()позволяют использовать виджет поиска Select2 дляForeignKeyиManyToManyField.
django.contrib.auth¶
- Число итераций по умолчанию для хешера паролей PBKDF2 увеличено с 36 000 до 100 000.
django.contrib.gis¶
- Добавлена поддержка MySQL для функций AsGeoJSON,GeoHash,IsValid,isvalid, и distance lookups.
- Добавлены функции AzimuthиLineLocatePoint, поддерживаемые в PostGIS и SpatiaLite.
- Любой GEOSGeometry, импортированный из GeoJSON, теперь имеет установленный SRID.
- Добавлен атрибут OSMWidget.default_zoomдля настройки уровня масштабирования карты по умолчанию.
- Сделал метаданные читаемыми и редактируемыми на растрах с помощью атрибутов metadata,infoиmetadata.
- Позволяет передавать специфичные для драйвера параметры создания объектам GDALRasterс помощьюpapsz_options.
- Позволяет создавать GDALRasterобъекты во внутренней виртуальной файловой системе GDAL. Растры теперь могут быть created from and converted to binary data в памяти.
- Новый метод GDALBand.color_interp()возвращает интерпретацию цвета для полосы.
django.contrib.postgres¶
- Новый аргумент distinctдляArrayAggопределяет, будут ли конкатенированные значения различаться.
- Новая функция базы данных RandomUUIDвозвращает UUID версии 4. Она требует использования расширения PostgreSQLpgcrypto, которое может быть активировано с помощью новой операции миграции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-ответ.
Общие представления¶
- Новый атрибут ContextMixin.extra_contextпозволяет добавлять контекст вView.as_view().
Команды управления¶
- inspectdbтеперь переводит беззнаковые целочисленные столбцы MySQL в- PositiveIntegerFieldили- PositiveSmallIntegerField.
- Новая опция makemessages --add-locationуправляет форматом комментариев в файлах.po.
- loaddataтеперь может read from stdin.
- Новая опция diffsettings --outputпозволяет форматировать вывод в унифицированном формате diff.
- В Oracle, inspectdbтеперь может интроспектироватьAutoField, если столбец создан как столбец идентичности.
- В MySQL, dbshellтеперь поддерживает TLS сертификаты на стороне клиента.
Миграции¶
- Новая опция squashmigrations --squashed-nameпозволяет именовать скомканную миграцию.
Модели¶
- Новая функция базы данных StrIndexнаходит начальный индекс строки внутри другой строки.
- В Oracle, AutoFieldиBigAutoFieldтеперь создаются как identity columns.
- Новый параметр chunk_sizeQuerySet.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_nameQuerySet.in_bulk()позволяет получать результаты на основе любого уникального поля модели.
- CursorWrapper.callproc()теперь принимает необязательный словарь параметров ключевых слов, если бэкенд поддерживает эту возможность. Из встроенных бэкендов Django только Oracle поддерживает эту возможность.
- Новый метод connection.execute_wrapper()позволяет installing wrappers around execution of database queries.
- Новый аргумент filterдля встроенных агрегатов позволяет adding different conditionals выполнять несколько агрегаций по одним и тем же полям или отношениям.
- Добавлена поддержка выражений в Meta.ordering.
- Новый параметр namedвQuerySet.values_list()позволяет получать результаты в виде именованных кортежей.
- Новый класс FilteredRelationпозволяет добавлять к кверисетам условиеON.
Пагинация¶
- Добавлено Paginator.get_page()для обеспечения документированного шаблона обработки недействительных номеров страниц.
Шаблоны¶
- Чтобы повысить полезность Engine.get_default()в сторонних приложениях, теперь он возвращает первый двигатель, если несколько двигателейDjangoTemplatesнастроены вTEMPLATES, а не поднимаетImproperlyConfigured.
- Пользовательские теги шаблонов теперь могут принимать аргументы, содержащие только ключевые слова.
Тесты¶
- Добавлена поддержка потоков в LiveServerTestCase.
- Добавлены настройки, позволяющие настраивать параметры тестового табличного пространства для Oracle: DATAFILE_SIZE,DATAFILE_TMP_SIZE,DATAFILE_EXTSIZEиDATAFILE_TMP_EXTSIZE.
Валидаторы¶
- Новый ProhibitNullCharactersValidatorзапрещает ввод нулевого символа в поле формыCharFieldи его подклассах. Ввод нулевого символа был замечен инструментами сканирования уязвимостей. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ вызывает исключение при попытке сохранить нулевой символ в поле char/text в PostgreSQL.
Изменения в версии 2.0, несовместимые с обратными изменениями¶
Удалена поддержка байтовых строк в некоторых местах¶
Для поддержки родных строк Python 2 старые версии Django должны были принимать как байтовые строки, так и строки Unicode. Теперь, когда поддержка Python 2 прекращена, байтовые строки должны встречаться только на границах ввода/вывода (обработка двоичных полей или HTTP-потоков, например). Возможно, вам придется обновить свой код, чтобы ограничить использование байтовых строк до минимума, так как Django больше не принимает байтовые строки в определенных путях кода. Опция Python -b может помочь обнаружить эту ошибку в вашем коде.
Например, 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 OF, установите значениеDatabaseFeatures.has_select_for_update_of = True. Если база данных требует, чтобы аргументамиOFбыли столбцы, а не таблицы, установитеDatabaseFeatures.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дляCharField, если аргументmax_lengthне предоставлен.
- Первым аргументом DatabaseCreation._clone_test_db()иget_test_db_clone_settings()теперь является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 по умолчанию - read committed¶
Уровень изоляции MySQL по умолчанию, repeatable read, может привести к потере данных при типичном использовании Django. Для предотвращения этого и для согласованности с другими базами данных, уровнем изоляции по умолчанию теперь является read committed. При необходимости вы можете использовать настройку DATABASES для use a different isolation level.
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() на нарезанном queryset приводит к неожиданным результатам из-за того, что нарезка применяется после переупорядочивания. Теперь это запрещено, например:
>>> 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¶
Это отобразится как обратно несовместимое изменение (IntegrityError: FOREIGN KEY constraint failed) при попытке сохранить существующий экземпляр модели, нарушающий ограничение внешнего ключа.
Внешние ключи теперь создаются с помощью DEFERRABLE INITIALLY DEFERRED вместо DEFERRABLE 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для поля модели. Добавьте это в существующие миграции или примите автоматически сгенерированную миграцию для полей, использующих эту опцию.
- Выполнение запросов, требующих automatic spatial transformations, теперь вызывает - NotImplementedErrorна MySQL вместо молчаливого использования нетрансформированных геометрий.
- django.core.exceptions.DjangoRuntimeWarningудален. Он использовался только в бэкенде кэша в качестве промежуточного класса при наследовании- CacheKeyWarningот- RuntimeWarning.
- Переименовал - BaseExpression._output_fieldв- output_field. Может потребоваться обновление пользовательских выражений.
- В старых версиях формы и наборы форм объединяли свои - Mediaс виджетом- Mediaпутем конкатенации. Теперь объединение пытается preserve the relative order of elements in each list.- MediaOrderConflictWarningвыдается, если порядок не может быть сохранен.
- django.contrib.gis.gdal.OGRExceptionудален. Это был псевдоним для- GDALExceptionсо времен Django 1.8.
- Поддержка GEOS 3.3.x прекращена. 
- Способ отбора данных для - GeometryFieldизменен для повышения производительности, и в необработанных SQL-запросах эти поля теперь должны быть обернуты в- connection.ops.select. Смотрите пример Raw queries note в учебнике по ГИС.
Функции, устаревшие в версии 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.
- Убран поиск MySQL __search.
- Удален шим для поддержки пользовательских классов связанных менеджеров без метода _apply_rel_filters().
- Использование User.is_authenticated()иUser.is_anonymous()в качестве методов, а не свойств, больше не поддерживается.
- Атрибут Model._meta.virtual_fieldsудаляется.
- Аргументы ключевых слов virtual_onlyвField.contribute_to_class()иvirtualвModel._meta.add_field()удаляются.
- Представления javascript_catalog()иjson_catalog()удалены.
- django.contrib.gis.utils.precision_wkt()удаляется.
- При многотабличном наследовании удалено неявное повышение OneToOneFieldдоparent_link.
- Поддержка Widget._format_value()удалена.
- Методы FileFieldget_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.