Примечания к выпуску 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. На этом этапе вы должны иметь возможность запускать тесты для своего проекта с помощью 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 чтобы она могла писать в конфигурации URL.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

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 и различные RangeField s ( django.contrib.postgres должны быть в INSTALLED_APPS ).

django.contrib.sitemaps

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

Кэш

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

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

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

Формы

  • Аргументы new 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.

Изменения несовместимы со старыми версиями в Django 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 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 функции для 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 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 опции поля модели . Добавьте это к существующим миграциям или примите автоматически сгенерированную миграцию для полей, которые его используют.

  • Выполнение запросов, требующих автоматических пространственных преобразований, теперь возникает 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.

См. « Функции, не рекомендуемые в Django 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_only in Field.contribute_to_class() и virtual in 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 ©2020 All rights reserved