Примечания к выпуску Django 2.0¶
2 декабря 2017 г.
Добро пожаловать в Джанго 2.0!
Эти примечания к выпуску охватывают новые функции, а также некоторые обратно несовместимые изменения, о которых вам следует знать при обновлении с Django 1.11 или более ранней версии. Мы отменили некоторые функции, цикл устаревания которых достиг конца, и мы начали процесс прекращения поддержки некоторых функций.
В этом выпуске Django начинает использовать свободную форму семантического управления версиями, но в версии 2.0 нет каких-либо существенных изменений обратной совместимости, которых можно было бы ожидать от версии 2.0. Обновление должно потребовать таких же усилий, как и предыдущие выпуски функций.
См. руководство Upgrading Django to a newer version, если вы обновляете существующий проект.
Совместимость версий 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.
Что нового в Джанго 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 в наборы запросов. В выражении вы можете использовать оконные функции и агрегатные функции.
Минорные изменения¶
django.contrib.admin¶
The new
ModelAdmin.autocomplete_fieldsattribute andModelAdmin.get_autocomplete_fields()method allow using a Select2 search widget forForeignKeyandManyToManyField.
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. Для этого требуется использование расширения 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¶
В конструктор
GenericSitemapдобавлен аргумент ключевого словаprotocol.
Кэш¶
cache.set_many()теперь возвращает список ключей, которые не удалось вставить. Для встроенных бэкэндов неудачные вставки могут произойти только в memcached.
Хранение файлов¶
File.open()можно использовать в качестве менеджера контекста, например.с file.open() как 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.The new
makemessages --add-locationoption controls the comment format in PO files.loaddataтеперь может читать со стандартного ввода.Новая опция
diffsettings --outputпозволяет форматировать выходные данные в едином формате различий.В Oracle
inspectdbтеперь может анализироватьAutoField, если столбец создан как столбец идентификаторов.В MySQL
dbshellтеперь поддерживает сертификаты TLS на стороне клиента.
Миграции¶
Новая опция
squashmigrations --squashed-nameпозволяет дать имя сжатой миграции.
Модели¶
Новая функция базы данных
StrIndexнаходит начальный индекс строки внутри другой строки.On Oracle,
AutoFieldandBigAutoFieldare now created as identity columns.Новый параметр 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.Новый параметр
namedQuerySet.values_list()позволяет получать результаты в виде именованных кортежей.Новый класс
FilteredRelationпозволяет добавлять предложение ON в наборы запросов.
Пагинация¶
Добавлен
Paginator.get_page()для обеспечения документированного шаблона обработки недопустимых номеров страниц.
Запросы и ответы¶
Веб-сервер
runserverподдерживает HTTP 1.1.
Шаблоны¶
Чтобы повысить полезность
Engine.get_default()в сторонних приложениях, теперь он возвращает первый движок, если в TEMPLATES настроено несколько движковDjangoTemplates, а не вызываетImproperlyConfigured.Теги пользовательских шаблонов теперь могут принимать аргументы, содержащие только ключевые слова.
Тесты¶
Добавлена поддержка потоков в
LiveServerTestCase.Добавлены настройки, позволяющие настраивать параметры тестового табличного пространства для Oracle:
DATAFILE_SIZE,DATAFILE_TMP_SIZE,DATAFILE_EXTSIZEиDATAFILE_TMP_EXTSIZE.
Валидаторы¶
Новый
ProhibitNullCharactersValidatorзапрещает использование нулевого символа во входных данных поля формыCharFieldи его подклассов. Ввод нулевых символов наблюдался с помощью инструментов сканирования уязвимостей. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ выдает исключение при попытке сохранить нулевой символ в символьном/текстовом поле с помощью 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()теперь являетсямодель, а нетаблица.Первым аргументом
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()теперь являетсясуффикс, а неномер(на тот случай, если вы хотите переименовать подписи в своем бэкэнде для обеспечения единообразия).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() запрещены после нарезки.¶
Calling QuerySet.reverse() or last() on a sliced queryset leads to
unexpected results due to the slice being applied after reordering. This is
now prohibited, e.g.:
>>> 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 не удалось») при попытке сохранить существующий экземпляр модели, нарушающий ограничение внешнего ключа.
Внешние ключи теперь создаются с использованием 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не существует.When
USE_L10Nis off,FloatFieldandDecimalFieldnow respectDECIMAL_SEPARATORandTHOUSAND_SEPARATORduring validation. For example, with the settings: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 по умолчанию увеличен с 20 МБ до 50 МБ, а размер автоматического расширения по умолчанию увеличен с 10 МБ до 25 МБ.
Чтобы повысить производительность при потоковой передаче больших наборов результатов из базы данных,
QuerySet.iterator()теперь извлекает 2000 строк за раз вместо 100. Старое поведение можно восстановить с помощью параметраchunk_size. Например:Book.objects.iterator(chunk_size=100)
Предоставление неизвестных имен пакетов в аргументе packages представления
JavaScriptCatalogтеперь вызываетValueErrorвместо того, чтобы передавать его автоматически.Первичный ключ экземпляра модели теперь отображается в методе Model.__str__() по умолчанию, например:
Объект вопроса (1).makemigrationsтеперь обнаруживает изменения в опции поля моделиlimit_choices_to. Добавьте это к существующим миграциям или примите автоматически созданную миграцию для полей, которые ее используют.Выполнение запросов, требующих автоматических пространственных преобразований, теперь вызывает
NotImplementedErrorв MySQL вместо молчаливого использования непреобразованной геометрии.django.core.Exceptions.DjangoRuntimeWarningудален. Он использовался только в кэше в качестве промежуточного класса в наследовании CacheKeyWarning от RuntimeWarning.BaseExpression._output_fieldпереименован вoutput_field. Возможно, вам придется обновить пользовательские выражения.В более старых версиях формы и наборы форм объединяют свой «Медиа» с виджетом «Медиа», объединяя их. Объединение теперь пытается сохранить относительный порядок элементов в каждом списке.
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()принимает те же аргументы, за исключением того, что он также требуетзапроса.Параметр 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__()удален.Удалена поддержка пользовательских представлений ошибок, которые не принимают параметр исключения.
Атрибут mime_type для django.utils.feedgenerator.Atom1Feed и django.utils.feedgenerator.RssFeed удален.
Аргумент
app_nameдляinclude()удален.Поддержка передачи кортежа из трёх элементов (включая
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дляSyndictionFeed.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 до родительской ссылки удаляется.
Поддержка 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удален.Наследование модели «Менеджер» следует правилам наследования MRO. Требование использовать Meta.manager_inheritance_from_future для согласия на это поведение удалено.
Поддержка промежуточного программного обеспечения старого стиля с использованием
settings.MIDDLEWARE_CLASSESудалена.