• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

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

django.contrib.auth

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

django.contrib.gis

django.contrib.postgres

  • Новый аргумент distinct для ArrayAgg определяет, будут ли объединенные значения различны.

  • Новая функция базы данных RandomUUID возвращает UUID версии 4. Для этого требуется использование расширения PostgreSQL pgcrypto, которое можно активировать с помощью новой операции миграции 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.

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

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

  • inspectdb теперь преобразует беззнаковые целочисленные столбцы MySQL в PositiveIntegerField или PositiveSmallIntegerField.

  • The new makemessages --add-location option controls the comment format in PO files.

  • loaddata теперь может читать со стандартного ввода.

  • Новая опция diffsettings --output позволяет форматировать выходные данные в едином формате различий.

  • В Oracle inspectdb теперь может анализировать AutoField, если столбец создан как столбец идентификаторов.

  • В MySQL dbshell теперь поддерживает сертификаты TLS на стороне клиента.

Миграции

Модели

  • Новая функция базы данных StrIndex находит начальный индекс строки внутри другой строки.

  • On Oracle, AutoField and BigAutoField are 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.

  • Новый параметр named QuerySet.values_list() позволяет получать результаты в виде именованных кортежей.

  • Новый класс FilteredRelation позволяет добавлять предложение ON в наборы запросов.

Пагинация

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

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

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

Шаблоны

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

  • Теги пользовательских шаблонов теперь могут принимать аргументы, содержащие только ключевые слова.

Тесты

Валидаторы

  • Новый 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_L10N is off, FloatField and DecimalField now respect DECIMAL_SEPARATOR and THOUSAND_SEPARATOR during 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 удалена.

Back to Top