Примечания к выпуску Django 1.7 ¶
2 сентября 2014 г.
Добро пожаловать в Django 1.7!
Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.6 или более старых версий. Мы начали процесс прекращения поддержки некоторых функций , а некоторые функции уже устарели и были удалены .
Совместимость с Python ¶
Django 1.7 требует Python 2.7, 3.2, 3.3 или 3.4. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.
Серия Django 1.6 - последняя, поддерживающая Python 2.6. Django 1.7 - первый выпуск, поддерживающий Python 3.4.
Это изменение должно коснуться только небольшого числа пользователей Django, поскольку сегодня большинство поставщиков операционных систем поставляют Python 2.7 или новее в качестве версии по умолчанию. Однако, если вы все еще используете Python 2.6, вам нужно будет оставаться на Django 1.6, пока вы не обновите свою версию Python. Согласно нашей политике поддержки , Django 1.6 будет продолжать поддерживаться на уровне безопасности до выпуска Django 1.8.
Что нового в Django 1.7 ¶
Миграции схемы ¶
Django теперь имеет встроенную поддержку миграции схем. Он позволяет обновлять, изменять и удалять модели путем создания файлов миграции, которые представляют изменения модели и которые можно запускать для любой базы данных разработки, подготовки к производству или производства.
Миграции описаны в отдельной документации , но некоторые из ключевых функций:
syncdb
устарел и заменен наmigrate
. Не волнуйтесь - вызовы по-syncdb
прежнему будут работать.Новая команда
makemigrations
предоставляет простой способ автоматически обнаруживать изменения в ваших моделях и выполнять для них миграции.django.db.models.signals.pre_syncdb
иdjango.db.models.signals.post_syncdb
устарели и должны быть заменены наpre_migrate
иpost_migrate
соответственно. Эти новые сигналы имеют несколько иные аргументы. Подробности смотрите в документации.Метод
allow_syncdb
маршрутизаторов базы данных теперь вызываетсяallow_migrate
, но по-прежнему выполняет ту же функцию. Маршрутизаторы с методами по-allow_syncdb
прежнему будут работать, но это имя метода устарело, и вы должны изменить его как можно скорее (не требуется ничего, кроме переименования).initial_data
фикстуры больше не загружаются для приложений с миграциями; Если вы хотите загрузить исходные данные для приложения, мы предлагаем вам создать миграцию для своего приложения и определить операциюRunPython
илиRunSQL
вoperations
разделе миграции.Поведение тестового отката отличается для приложений с миграциями; в частности, Django больше не будет имитировать восстановление для нетранзакционных баз данных или внутри них,
TransactionTestCase
если это специально не требуется .Не рекомендуется иметь приложение без миграции зависит (есть
ForeignKey
илиManyToManyField
в) приложениях с миграциями.
Переделка загрузки приложения ¶
Исторически приложения Django были тесно связаны с моделями. Синглтон, известный как «кеш приложений», обрабатывает как установленные приложения, так и модели. Модуль моделей использовался в качестве идентификатора приложений во многих API.
По мере развития концепции приложений Django этот код обнаруживал некоторые недостатки. Он был преобразован в «реестр приложений», в котором модули модели больше не играют центральной роли и где данные конфигурации могут быть прикреплены к приложениям.
На сегодняшний день улучшения включают:
- Приложения могут запускать код при запуске, прежде чем Django сделает что-нибудь еще, с помощью метода
ready()
их настройки. - Ярлыки приложений правильно назначаются шаблонам, даже если они определены вне
models.py
. Вам больше не нужно явно настраиватьсяapp_label
. - Можно
models.py
полностью опустить, если в приложении нет шаблонов. - Приложения могут быть переименованы с
label
помощью атрибута конфигурации приложений, чтобы обойти конфликты именования меток. - Название приложений можно настроить в интерфейсе администрирования с помощью атрибута
verbose_name
конфигураций приложений. - Интерфейс администрирования автоматически вызывается
autodiscover()
при запуске Django. Поэтому вы можете удалить эту строку из своего URLconf. - Django импортирует все конфигурации и модели приложений сразу после запуска с помощью простого детерминированного процесса. Это должно упростить диагностику проблем импорта, например циклов импорта.
Новый метод для подклассов полей ¶
Для помощи моторизованным как миграция схемы и позволяют добавление составных ключей легче в будущих версиях Django, то API Field
теперь имеет новый обязательный метод: deconstruct()
.
Этот метод не принимает аргументов и возвращает кортеж из четырех элементов:
name
: Имя атрибута поля в его родительской модели или None, если оно не является частью модели.path
: Путь Python с заостренным синтаксисом к классу этого поля, включая имя класса.args
: позиционные аргументы в виде спискаkwargs
: именованные аргументы, как dict
Эти четыре значения позволяют сериализовать любое поле в файл, а также безопасно копировать две важные части этих новых функций.
Это изменение не должно повлиять на вас, если вы не пишете собственные подклассы Field; в этом случае вам может потребоваться повторно реализовать метод, deconstruct()
если ваш подкласс __init__
каким-либо образом изменит сигнатуру метода . Если ваше поле просто наследуется от встроенного поля в Django и не расширяется __init__
, никаких изменений не требуется.
Если вам нужно расширить deconstruct()
, хорошее место для начала - встроенные поля в Django ( django/db/models/fields/__init__.py
), потому что несколько полей включают DecimalField
и DateField
расширяют его, и показывают, как вызвать метод в родительском классе и просто добавить или удалить дополнительные аргументы. ,
Это также означает, что все аргументы поля должны сами быть сериализуемыми; Чтобы узнать, что мы считаем сериализуемыми, и как сделать сериализуемыми собственные классы, см. документацию по сериализации миграции .
Вызов пользовательского метода QuerySet
из Manager
¶
Исторически рекомендованным способом выполнения запросов к модели многократного использования было создание методов в Manager
настраиваемом классе . Проблема с этим подходом заключается в том, что после первого вызова метода вы получаете экземпляр QuerySet
и не можете вызывать дополнительные методы настраиваемого обработчика.
Хотя это и не задокументировано, эту проблему обычно можно было обойти, создав QuerySet
пользовательские методы, чтобы их можно было связать в цепочку; но решение имело ряд недостатков:
QuerySet
Персонализированные и его индивидуальные методы были потеряны после первого вызоваvalues()
илиvalues_list()
.- Написание кастомного
Manager
класса по-прежнему необходимо для возвратаQuerySet
кастомного класса, и все желаемые методы в `` Менеджере '' необходимо перенаправить вQuerySet
. Весь процесс противоречил принципу DRY.
Теперь метод класса QuerySet.as_manager()
может напрямую создавать Manager с помощью методов QuerySet :
class FoodQuerySet(models.QuerySet):
def pizzas(self):
return self.filter(kind='pizza')
def vegetarian(self):
return self.filter(vegetarian=True)
class Food(models.Model):
kind = models.CharField(max_length=50)
vegetarian = models.BooleanField(default=False)
objects = FoodQuerySet.as_manager()
Food.objects.pizzas().vegetarian()
Использование собственного обработчика при обходе обратных отношений ¶
Теперь можно указать собственный обработчик при обходе обратной зависимости:
class Blog(models.Model):
pass
class Entry(models.Model):
blog = models.ForeignKey(Blog)
objects = models.Manager() # Default Manager
entries = EntryManager() # Custom Manager
b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()
Новая инфраструктура проверки системы ¶
Мы добавили новую инфраструктуру системного мониторинга для обнаружения распространенных проблем (например, недопустимых моделей) и предоставления рекомендаций по их устранению. Инфраструктура является расширяемой, так что вы можете добавлять свои собственные элементы управления для собственных приложений и библиотек.
Для выполнения системных проверок вы используете команду check
управления. Эта команда заменяет старую validate
команду управления.
Ярлыки интерфейса администратора поддерживают часовые пояса ¶
Ярлыки «сегодня» и «сейчас» рядом с компонентами ввода даты и времени в интерфейсе администрирования теперь работают в текущем часовом поясе . Раньше они использовали часовой пояс браузера, что могло приводить к тому, что вводились неверные значения, если они не соответствовали часовому поясу текущего сервера.
Кроме того, компоненты теперь отображают справочное сообщение, когда часовой пояс браузера и сервера различаются, чтобы указать, как будет интерпретироваться значение, вставленное в поле.
Использование курсоров базы данных в качестве менеджеров контекста ¶
До Python 2.7 курсоры базы данных можно было использовать в качестве диспетчера контекста. Курсор для конкретного движка определяет поведение диспетчера контекста. Поведение поиска магических методов изменилось в Python 2.7, и курсоры больше не могут использоваться в качестве диспетчера контекста.
Django 1.7 позволяет использовать курсор в качестве диспетчера контекста. Другими словами, можно использовать следующее:
with connection.cursor() as c:
c.execute(...)
вместо того :
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
Пользовательские выражения поиска ¶
Теперь можно писать собственные поисковые запросы и преобразования для ORM. Пользовательские поиски работают так же, как встроенные поисковые запросы Django (например lte
,
icontains
), в то время как преобразования - это новая концепция.
Класс django.db.models.Lookup
предоставляет возможность добавлять операторы поиска для полей модели. В качестве примера можно добавить day_lte
для них оператор DateFields
.
Класс django.db.models.Transform
позволяет преобразовывать значения базы данных перед окончательным преобразованием. Например, можно написать преобразование, year
которое извлекает год из значения поля. Преобразования позволяют создавать цепочки. После того, как преобразование year
было добавлено DateField
, можно, например, выполнить фильтрацию по преобразованному значению qs.filter(author__birthdate__year__lte=1981)
.
Дополнительные сведения как о выражениях поиска, так и о пользовательских преобразованиях см. В документации по пользовательскому поиску .
Улучшения обработки ошибок в Form
¶
Form.add_error()
¶
Раньше было две основные модели обработки ошибок в формах:
- Рычаг a
ValidationError
От определенных функций (напримерField.clean()
,Form.clean_<fieldname>()
илиForm.clean()
для ошибок без обращения к полям) - Управляйте
Form._errors
путем нацеливания на конкретное полеForm.clean()
или добавления ошибок с помощью внешнего "чистого" метода (например, непосредственно из представления).
Использование первой практики было простым и понятным, поскольку форма может угадывать из контекста (то есть, какой метод вызвал исключение), откуда происходят ошибки, и обрабатывать их автоматически. Это остается каноническим способом добавления ошибок, когда это возможно. Однако последнее было утомительным и подверженным ошибкам, поскольку большая часть обработки граничных эффектов оставалась на усмотрение пользователя.
Новый метод add_error()
позволяет добавлять ошибки в определенные поля формы из любого места, не беспокоясь о деталях; например, создание экземпляров django.forms.utils.ErrorList
или обработка Form.cleaned_data
. Этот новый API заменяет управление Form._errors
которым теперь становится частным API.
См. Раздел Очистка и проверка полей, которые зависят друг от друга, в качестве примера использования Form.add_error()
.
Метаданные ошибок ¶
Конструктор ValidationError
принимает метаданные, такие как code
ошибка или params
которые затем доступны для интерполяции в сообщение об ошибке (подробнее см. Создание ValidationError ); однако до Django 1.7 эти метаданные отбрасывались, когда добавлялись ошибки Form.errors
.
Form.errors
и django.forms.utils.ErrorList
теперь храним экземпляры ValidationError
, поэтому эти метаданные можно получить в любое время с помощью нового метода Form.errors.as_data
.
Затем ValidationError
извлеченные экземпляры могут быть идентифицированы по их code
ошибке, что позволяет такие вещи, как переписывание сообщения об ошибке или запись пользовательской логики в представление, когда присутствует данная ошибка. Его также можно использовать для сериализации ошибок в настраиваемом формате, таком как XML.
Новый метод Form.errors.as_json()
- удобный метод, который возвращает сообщения об ошибках, а также коды ошибок, сериализованные в JSON. as_json()
использует as_data()
и дает представление о том, как можно расширить новую систему.
Контейнеры ошибок и обратная совместимость ¶
Глубокие изменения в погрешности различных контейнеров были необходимы для поддержки указанных выше особенностей, а именно Form.errors
, Django.forms.utils.ErrorList
а внутренние хранилища ValidationError
. Эти контейнеры, ранее использовавшиеся для хранения строк ошибок, теперь хранят экземпляры, ValidationError
а общедоступные API-интерфейсы были адаптированы, чтобы сделать это максимально прозрачным, но если вы использовали частные API-интерфейсы, некоторые изменения не имеют обратной совместимости; см. подробности о конструкторе ValidationError и внутренней памяти .
Незначительные особенности ¶
django.contrib.admin
¶
- Теперь вы можете реализовать атрибуты
site_header
,site_title
аindex_title
наAdminSite
обычае легко изменить название и текст заголовка администрации сайта. Больше не нужно расширять шаблоны! - Кнопки
django.contrib.admin
теперь используют свойство CSSborder-radius
для закругленных углов, а не фоновые изображения GIF. - Некоторые шаблоны интерфейса администратора теперь есть
app-<app_name>
и классыmodel-<model_name>
в их теге<body>
возможности настройки CSS с помощью приложения или по шаблону. - Ячейки в списке объектов редактирования интерфейса администратора теперь имеют класс
field-<field_name>
в коде HTML, позволяющий стилистические настройки. - Благодаря новому методу поля поиска в интерфейсе администрирования теперь можно настраивать по запросу
django.contrib.admin.ModelAdmin.get_search_fields()
. - Этот метод
ModelAdmin.get_fields()
можно расширить, чтобы настроить значениеModelAdmin.fields
. - В дополнение к
admin.site.register
существующему синтаксису вы можете использовать новый декораторregister()
для регистрацииModelAdmin
. - Можно указать отключение ссылок в сетке страницы списка объектов для редактирования.
ModelAdmin.list_display_links
= None
- Теперь вы можете указать,
ModelAdmin.view_on_site
будет ли отображаться ссылка «Просмотр на сайте». - Вы можете указать порядок убывания значения
ModelAdmin.list_display
, поставив перед значениемadmin_order_field
дефис. - Метод
ModelAdmin.get_changeform_initial_data()
может быть расширен для определения пользовательского поведения для настройки исходных данных формы редактирования.
django.contrib.auth
¶
- Все, что
**kwargs
передаетсяemail_user()
, передается в базовом вызовеsend_mail()
. - Декоратор
permission_required()
может так же легко получить список разрешений, как и одно разрешение. - Вы можете расширить новый метод,
AuthenticationForm.confirm_login_allowed()
чтобы упростить настройку политики входа в систему. django.contrib.auth.views.password_reset()
принимает необязательныйhtml_email_template_name
параметр, используемый для отправки составного HTML-письма для сброса пароля.AbstractBaseUser.get_session_auth_hash()
Добавили метод , и если вашиAUTH_USER_MODEL
наследуется отAbstractBaseUser
, изменения пароля пользователя теперь аннулирует старые сессии , еслиdjango.contrib.auth.middleware.SessionAuthenticationMiddleware
включен. Дополнительные сведения см. В разделе « Аннулирование сеанса при смене пароля» .
django.contrib.formtools
¶
- Призывы
WizardView.done()
теперь включать в себя,form_dict
чтобы упростить доступ к формам по имени их шага.
django.contrib.gis
¶
- Версия библиотеки OpenLayers по умолчанию, включенная в компоненты, была обновлена с 2.11 до 2.13.
- Подготовленные геометрии теперь поддерживают предикаты
crosses
,disjoint
,overlaps
,touches
иwithin
, если GEOS 3.3 или более позднюю версию.
django.contrib.messages
¶
- Механизмы
django.contrib.messages
, использующие файлы cookie, теперь уважают настройкиSESSION_COOKIE_SECURE
иSESSION_COOKIE_HTTPONLY
. - Контекст процессор Сообщения теперь добавляет словарь уровня по умолчанию под именем
DEFAULT_MESSAGE_LEVELS
. Message
Теперь у объектов есть атрибутlevel_tag
, содержащий текстовое представление уровня сообщения.
django.contrib.redirects
¶
RedirectFallbackMiddleware
имеет два новых атрибута (response_gone_class
иresponse_redirect_class
), которые определяют типы экземпляров,HttpResponse
возвращаемых промежуточным программным обеспечением.
django.contrib.sessions
¶
- Теперь
"django.contrib.sessions.backends.cached_db"
серверная часть сеанса уважаетSESSION_CACHE_ALIAS
. В предыдущих версиях всегда использовалсяdefault
кеш.
django.contrib.sitemaps
¶
- L » теперь используется для определения заголовка в ответе. Это позволяет обрабатывать условные запросы для карт сайта, которые определяют .
infrastructure de plan du site
lastmod
Last-Modified
ConditionalGetMiddleware
GET
lastmod
django.contrib.sites
¶
- Новый
django.contrib.sites.middleware.CurrentSiteMiddleware
позволяет определять текущий сайт для каждого запроса.
django.contrib.staticfiles
¶
В классах хранения статических файлов могут быть подразделено заменить разрешения статических файлов и каталоги получать собранные путем корректировки параметров
file_permissions_mode
иdirectory_permissions_mode
. См.collectstatic
Пример использования.CachedStaticFilesStorage
Бэкенд получает класс родственного под названием ,ManifestStaticFilesStorage
которое не использует систему кэширования на всех , но вместо того, чтобы файл в формате JSON с именемstaticfiles.json
для сохранения соответствия между именем исходного файла (напримерcss/styles.css
) и именем файла Хешированного (напримерcss/styles.55e7cbb9ba48.css
).staticfiles.json
Файл создается при выполненииcollectstatic
команды управления и должна быть менее дорогой альтернативой для удаленных хранилищ , таких как Amazon S3.Смотрите документацию
ManifestStaticFilesStorage
для получения дополнительной информации.findstatic
теперь принимает уровень детализации 2, что означает, что он будет отображать относительные пути к каталогам, которые он искал. См.findstatic
Пример вывода.
django.contrib.syndication
¶
- Элемент
updated
фида синдикацииAtom1Feed
теперь используетupdateddate
вместоpubdate
, что позволяетpublished
включить элемент в фид (который основан наpubdate
).
Кэш ¶
- Доступ к настроенным кешам
CACHES
теперь доступен черезdjango.core.cache.caches
. Этот dict-подобный объект предоставляет отдельный экземпляр для каждого потока. Он заменяет то,django.core.cache.get_cache()
что теперь устарело. - Если вы создали экземпляр механизма кэширования напрямую, имейте в виду, что он больше не является потокобезопасным, поскольку
django.core.cache.caches
теперь порождает разные экземпляры для каждого потока. - Установка аргумента
TIMEOUT
в настройках ,CACHES
чтобы будетNone
установить ключи кэша «не истекающий» по умолчанию. Раньше можно было переключиться только на метод кэширования.timeout = None
set()
Подделка межсайтовых запросов ¶
- Настройка
CSRF_COOKIE_AGE
упрощает использование файлов cookie сеанса CSRF.
Электронная почта ¶
send_mail()
теперь принимаетhtml_message
параметр для отправки электронного письма, состоящего из нескольких частей text / plain и text / html .- Теперь SMTP
EmailBackend
принимаетtimeout
параметр.
Файловое хранилище ¶
- Блокировка файлов в Windows ранее зависела от пакета PyWin32; если бы он не был установлен, блокировка файла завершилась бы ошибкой. Эта зависимость была удалена, и теперь блокировка файлов встроена как в Windows, так и в Unix.
Загрузка файлов ¶
- Новый атрибут
UploadedFile.content_type_extra
содержит дополнительные параметры, передаваемые в заголовокcontent-type
во время загрузки файла. - Новый параметр
FILE_UPLOAD_DIRECTORY_PERMISSIONS
управляет разрешениями файловой системы для каталогов, созданных во время загрузки файлов, так же, какFILE_UPLOAD_PERMISSIONS
и для файлов. - Атрибут
FileField.upload_to
теперь необязательный. Если он опущен, установлен в значениеNone
или пустая строка, подкаталог не будет использоваться для хранения загруженных файлов. - Загруженные файлы теперь явно закрываются до того, как ответ будет доставлен клиенту. Частично загруженные файлы также закрываются, если они указаны
file
в диспетчере загрузки. Storage.get_available_name()
Теперь добавьте подчеркивание плюс буквенно-цифровую строку из 7 случайных символов (например"_x3a1gho"
), а не перебирайте подчеркивание, за которым следует число (например"_1"
,"_2"
и т. Д.), Чтобы предотвратить DoS-атаку. служба. Это изменение также было внесено в версии безопасности 1.6.6, 1.5.9 и 1.4.14.
Формы ¶
- Ключевые слова
<label>
и<input>
оказываемыеRadioSelect
иCheckboxSelectMultiple
когда Перебор переключателей или флажков в настоящее время включаютfor
и атрибутыid
, соответственно. Каждый переключатель или флажок включает атрибут, которыйid_for_label
создает идентификатор элемента. - Теги ,
<textarea>
предоставляемые вTextarea
настоящее время включают в себя атрибут ,maxlength
если поле шаблонаTextField
имеет одинmax_length
. Field.choices
теперь позволяет настраивать тег «пустой выбор» путем включения кортежа с пустой строкой илиNone
для ключа и настраиваемого тега в качестве значения. Пустая опция по умолчанию"----------"
в этом случае будет опущена.MultiValueField
разрешить необязательные подполя, задав для аргументаrequire_all_fields
значениеFalse
. Атрибутrequired
для каждого отдельного поля будет соблюдаться, и новая ошибка проверкиincomplete
будет вызвана, когда обязательное поле будет пустым.- Метод
clean()
формы больше не нужно возвращатьself.cleaned_data
. Если он вернет измененный словарь, он будет использован. - После временной регрессии в Django 1.6, теперь снова можно гарантировать , что метод
coerce
поTypedChoiceField
возвращению произвольного значения. SelectDateWidget.months
можно использовать для настройки формулировки месяцев, отображаемых в виджете выбора.- Параметры
min_num
иvalidate_min
были добавлены, чтобыformset_factory()
обеспечить проверку минимального количества отправленных форм. - Метаклассы, используемые
Form
иModelForm
были переработаны для обработки сценариев множественного наследования. Предыдущее ограничение , которое одновременно предотвратить наследование двухForm
иModelForm
был удален, покаModelForm
первым в MRO. - Теперь можно удалить поле из поля
Form
во время подклассификации, задав для него имяNone
. - Теперь можно настроить сообщения об ошибках для ограничения
unique
,unique_for_date
иunique_together
изModelForm
. Чтобы поддержатьunique_together
или что-то ещеNON_FIELD_ERROR
,ModelForm
теперь посмотрите на ключNON_FIELD_ERROR
в словаре внутреннегоerror_messages
класса . Для получения более подробной информации см. Соображения по модели error_messages .Meta
ModelForm
Интернационализация ¶
- Атрибут
django.middleware.locale.LocaleMiddleware.response_redirect_class
позволяет настраивать перенаправления, создаваемые промежуточным программным обеспечением. LocaleMiddleware
Теперь хранит язык , выбранный пользователем с помощью ключа сеанса_language
. Он должен быть доступен только с помощью константыLANGUAGE_SESSION_KEY
. Раньше он хранился с ключом,django_language
а константаLANGUAGE_SESSION_KEY
не существовала, но ключи, зарезервированные Django, должны начинаться с подчеркивания. Для обратной совместимостиdjango_language
всегда читается в 1.7. Сеансы будут перенесены на новый ключ по мере их написания.- Тег
blocktrans
теперь поддерживает параметрtrimmed
. Этот параметр удалит символы новой строки в начале и конце содержимого тега{%blocktrans%}
, заменит пробелы в начале и конце строки и объединит все строки в одну с помощью пробела. разделить их. Это очень полезно для отступа содержимого тега без наличия символов отступа в соответствующей записи PO-файла, что упрощает процесс перевода.{% blocktrans%}
- При запуске
makemessages
из корневого каталога проекта все извлеченные строки будут автоматически отправляться в приложение или файл сообщения проекта. Дополнительные сведения см. В разделе « Регионализация: создание языковых файлов» . - Теперь команда
makemessages
всегда добавляет к команде флаг--previous
команднойmsgmerge
строки, сохраняя строки, уже переведенные в файлы po для нечетких строк. - Следующие параметры были введены для решения варианты языка печенья:
LANGUAGE_COOKIE_AGE
,LANGUAGE_COOKIE_DOMAIN
иLANGUAGE_COOKIE_PATH
. - Добавлена регионализация форматов для эсперанто.
Команды администрирования ¶
Новая
--no-color
опцияdjango-admin
отключает раскрашивание вывода команд управления.Параметры new и , а также аргументы new и for позволяют использовать естественные первичные ключи при сериализации.
dumpdata --natural-foreign
dumpdata --natural-primary
use_natural_foreign_keys
use_natural_primary_keys
serializers.serialize()
Больше нет необходимости указывать имя таблицы кэша или
--database
параметр дляcreatecachetable
команды. Django берет эту информацию из вашего файла настроек. Если вы настроили несколько кешей или несколько баз данных, будут созданы все таблицы кешей.Команда
runserver
получила несколько улучшений:- В системах Linux, если установлен pyinotify , сервер разработки немедленно перезагружается при изменении файла. Раньше он каждую секунду опрашивал файловую систему на предмет изменений. Это вызвало небольшую задержку перед подзарядкой и уменьшило время автономной работы портативных компьютеров.
- Кроме того, сервер разработки автоматически перезагружается при обновлении файла перевода, то есть после выполнения
compilemessages
. - В консоли регистрируются все HTTP-запросы, включая запросы статических файлов или те
favicon.ico
, которые обычно отфильтровывались.
Команды управления теперь могут создавать цветной синтаксис вывода в Windows, если сторонний инструмент ANSICON установлен и запущен.
Команда
collectstatic
теперь поддерживает параметр символической ссылки в Windows NT 6 (Windows Vista и новее).Исходные данные SQL теперь работают лучше, если установлена библиотека sqlparse Python.
Обратите внимание, что эта практика не рекомендуется в пользу операции
RunSQL
миграции, которая выигрывает от улучшенного поведения.
Модели ¶
- Метод
QuerySet.update_or_create()
был добавлен. - Новая опция
Meta
шаблонаdefault_permissions
позволяет вам настроить (или отключить) создание разрешений на добавление, редактирование и удаление по умолчанию. - В
OneToOneField
явные из них для Multi-Table Inheritance теперь обнаружены в абстрактных классах. - Теперь можно избежать создания обратной связи для
OneToOneField
, задав для нееrelated_name
значение'+'
или завершив его на'+'
. - Их поддерживает оператор мощности ( ).
expressions F
**
- Методы
remove()
иclean()
связанные обработчики, созданныеForeignKey
иGenericForeignKey
теперь принимают аргумент ключевого слова,bulk
чтобы контролировать, используются ли массовые операции (т.е. использованиеQuerySet.update()
). По умолчаниюTrue
. - Теперь можно использовать
None
значение запроса для поискаiexact
. - Теперь можно передать вызываемый объект в качестве значения атрибута
limit_choices_to
при определении одногоForeignKey
или одногоManyToManyField
. - Обращение к результату
only()
иdefer()
по результатуQuerySet.values()
теперь вызывает ошибку (до этого это приводило либо к ошибке базы данных, либо к неверным данным). - Вы можете использовать один список для
index_together
(а не список списков) при указании одного набора полей. - Промежуточные пользовательские модели, имеющие более одного внешнего ключа для одной из моделей, участвующих в множественном отношении, теперь разрешены при условии, что вы явно укажете, какие внешние ключи следует использовать при настройке нового аргумента
ManyToManyField.through_fields
. - Присвоение экземпляра шаблона нереляционному полю теперь вызовет ошибку. Раньше это работало, если поле, играющее роль первичного ключа, принимало целые числа в качестве входных данных.
- Целочисленные поля теперь проверяются максимальными и минимальными значениями, специфичными для механизма базы данных, в соответствии с их
internal_type
. Ранее проверка поля шаблона не препятствовала сохранению значений, выходящих за пределы диапазона значений, относящихся к типу столбца; затем приводит к ошибке целостности. - Теперь его можно использовать
order_by()
явно с полем отношения_id
, используя имя его атрибута.
Сигналы ¶
- К
enter
сигналу добавлен аргументsetting_changed
. - Сигналы модели теперь могут быть связаны с использованием
str
формата in,'app_label.ModelName'
как и связанные поля, для ленивых ссылок на их эмиттеры.
Шаблоны ¶
- Теперь метод
Context.push()
возвращает обработчик контекста, который автоматически вызываетpop()
при выходе из объявленияwith
. Кроме того,push()
теперь принимает параметры, которые передаютсяdict
конструктору, который используется для создания нового уровня контекста. - Новый метод
Context.flatten()
возвращает стекContext
в виде единого плоского словаря. - Объекты
Context
теперь можно сравнивать на предмет равенства (внутренне это используется,Context.flatten()
чтобы внутренняя структура каждого стекаContext
не имела значения, если их плоская версия одинакова). - Тег шаблона
widthratio
теперь принимает параметр"as"
для фиксации результата в переменной. - Тег шаблона
include
теперь также принимает все, что имеет методrender()
(например,Template
) в качестве аргумента. Как всегда, поиск аргументов в виде строк будет выполнятьсяget_template()
. - Теперь можно рекурсивно включать шаблоны с помощью
include
. - У объектов шаблона теперь установлен атрибут происхождения, когда он
TEMPLATE_DEBUG
естьTrue
. Это позволяет проверять источники шаблонов и регистрировать их внеdjango.template
инфраструктуры. - Исключения
TypeError
больше не заглушаются при возникновении во время рендеринга шаблона. - Следующие функции теперь принимают
dirs
параметр, который является переопределенным списком или кортежемTEMPLATE_DIRS
:django.template.loader.get_template()
django.template.loader.select_template()
django.shortcuts.render()
django.shortcuts.render_to_response()
time
Фильтр теперь принимает часовой пояс , связанных с спецификаторов размера'e'
,'O'
,'T'
и'Z'
и надежно усваивать часовой пояс-зависимыеdatetime
органы , выполняющие ожидаемый рендеринг.cache
Тег теперь будет пытаться использовать кэш под названием «template_fragments» , если она существует и возвращаться к использованию кэша по умолчанию в противном случае. Он также теперь принимает необязательныйusing
аргумент ключевого слова для управления используемым кешем.- Новый
truncatechars_html
фильтр обрезает строку до длины, не превышающей указанное количество символов, с учетом HTML.
Запросы и ответы ¶
- Новый
HttpRequest.scheme
атрибут определяет схему запроса (http
илиhttps
обычно). - Ярлык
redirect()
теперь поддерживает относительные URL-адреса. - Новый
JsonResponse
подклассHttpResponse
помогает легко создавать ответы в формате JSON.
Тесты ¶
DiscoverRunner
имеет два новых атрибутаtest_suite
иtest_runner
, которые упрощают переопределение способа сбора и запуска тестов.fetch_redirect_response
Аргумент был добавлен вassertRedirects()
. Поскольку тестовый клиент не может получать внешние URL-адреса, это позволяет использоватьassertRedirects
перенаправления, которые не являются частью вашего приложения Django.- Правильная обработка схемы при сравнении в
assertRedirects()
. secure
Аргумент был добавлен ко всем методам запроса оClient
. ЕслиTrue
, то запрос будет сделан через HTTPS.assertNumQueries()
теперь выводит список выполненных запросов, если утверждение не выполняется.WSGIRequest
Экземпляр генерируется тест - обработчик теперь прикреплен кdjango.test.Response.wsgi_request
атрибуту.- Настройки базы данных для тестирования были собраны в словарь с именем
TEST
.
Утилиты ¶
- Повышенная точность
strip_tags()
(но все еще не может гарантировать безопасный вывод HTML, как указано в документации).
Валидаторы ¶
RegexValidator
теперь принимает необязательныеflags
и логическиеinverse_match
аргументы.inverse_match
Атрибут определяет , будет лиValidationError
должен быть поднят , когда регулярное выражение соответствует (True
) или не соответствует (False
по умолчанию) предоставленныйvalue
.flags
Атрибут устанавливает флаги , используемые при составлении регулярных выражений строки.URLValidator
теперь принимает необязательныйschemes
аргумент, который позволяет настраивать принятые схемы URI (вместо значений по умолчаниюhttp(s)
иftp(s)
).validate_email()
теперь принимает адреса с литералами IPv6, например[email protected][2001:db8::1]
, как указано в RFC 5321.
Backwards несовместимые изменения в 1.7 ¶
Предупреждение
В дополнение к изменениям, описанным в этом разделе, обязательно ознакомьтесь с планом прекращения поддержки всех функций, которые были удалены. Если вы не обновили свой код в течение срока прекращения поддержки для данной функции, ее удаление может показаться обратным несовместимым изменением.
allow_syncdb
/ allow_migrate
¶
Хотя Django по-прежнему будет рассматривать allow_syncdb
методы, даже если они должны быть переименованы в allow_migrate
, существует небольшая разница в том, какие модели передаются этим методам.
Для приложений с миграциями allow_migrate
теперь будут передаваться
исторические модели , которые представляют собой специальные модели с версиями без настраиваемых атрибутов, методов или менеджеров. Убедитесь, что ваши allow_migrate
методы относятся только к полям или другим элементам в model._meta
.
initial_data ¶
Приложения с миграциями не будут загружать initial_data
фикстуры после завершения миграции. Приложения без миграции будут продолжать загружать эти фикстуры на этапе, migrate
имитирующем старое syncdb
поведение, но любые новые приложения не будут иметь этой поддержки.
Вместо этого вам предлагается загружать исходные данные в миграции, если они вам нужны (используя RunPython
операцию и классы вашей модели); это имеет дополнительное преимущество, заключающееся в том, что ваши исходные данные не нужно обновлять каждый раз, когда вы меняете схему.
Кроме того, как и остальной старый syncdb
код Django , initial_data
был запущен по пути устаревания и будет удален в Django 1.9.
deconstruct () и сериализуемость ¶
Django теперь требует, чтобы все классы Field и все их аргументы конструктора были сериализуемыми. Если вы каким-либо образом измените подпись конструктора в своем настраиваемом поле, вам потребуется реализовать метод deconstruct (); мы расширили документацию по настраиваемым полям инструкциями по реализации этого метода .
Требование, чтобы все аргументы поля были сериализуемыми, означает, что любые экземпляры настраиваемых классов, передаваемые в конструкторы полей - например, такие как настраиваемые подклассы Storage - также должны иметь метод деконструкции, определенный для них , хотя Django предоставляет удобный декоратор классов, который будет работать для большинства приложений.
App загрузка изменений ¶
Последовательность запуска ¶
Django 1.7 загружает конфигурации и модели приложения сразу после запуска. Хотя такое поведение более прямолинейно и считается более устойчивым, нельзя исключать регрессии. См. Раздел « Поиск и устранение неисправностей» для решения некоторых проблем, с которыми вы можете столкнуться.
Автономные скрипты ¶
Если вы используете Django в простом скрипте Python, а не в команде управления, и полагаетесь на DJANGO_SETTINGS_MODULE
переменной среды, теперь вы должны явно инициализировать Django в начале вашего скрипта с помощью:
>>> import django
>>> django.setup()
В противном случае вы попадете в AppRegistryNotReady
исключение.
Скрипты WSGI ¶
До Django 1.3 рекомендуемый способ создания приложения WSGI был:
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
В Django 1.4 была улучшена поддержка WSGI, а API изменен на:
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Если вы все еще используете первый стиль в своем сценарии WSGI, вам необходимо перейти на второй, иначе вы столкнетесь с AppRegistryNotReady
исключением.
Согласованность реестра приложений ¶
Больше невозможно иметь несколько установленных приложений с одной и той же меткой. В предыдущих версиях Django это не всегда работало правильно, но и не вылетало сразу.
Если у вас есть два приложения с одинаковым ярлыком, вы должны создать
AppConfig
для одного из них и переопределить его
label
там. Затем вы должны скорректировать свой код везде, где он ссылается на это приложение или его модели со старой меткой.
Больше невозможно импортировать одну и ту же модель дважды по разным путям. Начиная с Django 1.6, это может произойти, только если вы вручную помещаете каталог и подкаталог вPYTHONPATH
, Инструкции по миграции см. В разделе о новом макете проекта в примечаниях к выпуску 1.4 .
Вы должны убедиться:
- Все модели определены в приложениях, которые перечислены
INSTALLED_APPS
или имеют явныйapp_label
. - Модели не импортируются как побочный эффект загрузки их приложения. В частности, вам не следует импортировать модели в корневой модуль приложения или в модуль, который определяет его класс конфигурации.
Django будет применять эти требования с версии 1.9 после периода прекращения поддержки.
Создание подкласса AppCommand ¶
Подклассы AppCommand
теперь должны реализовывать
handle_app_config()
метод вместо
handle_app()
. Этот метод получает AppConfig
экземпляр вместо модуля моделей.
Изучение приложений ¶
Поскольку INSTALLED_APPS
теперь в дополнение к модулям приложения поддерживаются классы конфигурации приложения, вам следует просмотреть код, который обращается к этому параметру напрямую, и django.apps.apps
вместо этого использовать реестр приложений ( ).
Реестр приложений сохранил некоторые функции старого кеша приложений. Несмотря на то, что кеш приложения был частным API, устаревшие методы и аргументы будут удалены с помощью стандартного пути отказа от поддержки, за исключением следующих изменений, которые вступают в силу немедленно:
get_model
возникаетLookupError
вместо возврата,None
если модель не найдена.only_installed
Аргументget_model
иget_models
больше не существует, и не делаетseed_cache
аргументget_model
.
Команды управления и порядок ¶INSTALLED_APPS
Когда несколько приложений предоставляют команды управления с одинаковыми именами, Django загружает команду из приложения, которое приходит первым
INSTALLED_APPS
. Предыдущие версии загружали команду из приложения, которое было последним.
Это приводит обнаружение команд управления в соответствие с другими частями Django, которые зависят от порядка INSTALLED_APPS
, например статические файлы, шаблоны и переводы.
ValidationError
конструктор и внутреннее хранилище ¶
Поведение ValidationError
конструктора изменилось, когда он получил контейнер ошибок в качестве аргумента (например, a list
или an
ErrorList
):
- Он преобразует все найденные строки в экземпляры
ValidationError
перед добавлением их во внутреннюю память. - Он не хранит данный контейнер, а скорее копирует его содержимое в собственное внутреннее хранилище; ранее сам контейнер был добавлен к
ValidationError
экземпляру и использовался как внутреннее хранилище.
Это означает, что если вы обращаетесь к ValidationError
внутренним хранилищам, например error_list
: error_dict
; или возвращаемое значение
update_error_dict()
you может найти экземпляры того места, ValidationError
где вы раньше находили строки.
Кроме того, если вы непосредственно закрепленные возвращаемое значение update_error_dict()
для Form._errors
вас может непреднамеренно добавить list
случаев , когда
ErrorList
ожидаются экземпляры. Это проблема, потому что, в отличие от простого list
, объект ErrorList
знает, как обрабатывать экземпляры
ValidationError
.
Большинство случаев использования, которые требуют использования этих частных API, теперь покрываются новым Form.add_error()
методом:
# Old pattern:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# New pattern:
try:
# ...
except ValidationError as e:
self.add_error(None, e)
Если вам нужна совместимость как с Django <= 1.6, так и с 1.7, вы не можете использовать ее,
Form.add_error()
поскольку она не была доступна до Django 1.7, но вы можете использовать следующий обходной путь для преобразования любого list
в ErrorList
:
try:
# ...
except ValidationError as e:
self._errors = e.update_error_dict(self._errors)
# Additional code to ensure ``ErrorDict`` is exclusively
# composed of ``ErrorList`` instances.
for field, error_list in self._errors.items():
if not isinstance(error_list, self.error_class):
self._errors[field] = self.error_class(error_list)
Поведение в LocMemCache
отношении ошибок рассола ¶
В предыдущих версиях Django существовала несогласованность в том, как ошибки рассоления обрабатываются различными серверными модулями кеширования.
django.core.cache.backends.locmem.LocMemCache
используется для автоматического отказа при возникновении такой ошибки, что несовместимо с другими серверными модулями и приводит к ошибкам, связанным с кешем. Это было исправлено в Django 1.7, подробнее см.
# 21200 .
Ключи кеша теперь генерируются из абсолютного URL запроса ¶
Предыдущие версии Django генерировали ключи кеша, используя путь запроса и строку запроса, но не схему или хост. Если приложение Django обслуживает несколько поддоменов или доменов, ключи кеша могут конфликтовать. В Django 1.7 ключи кеша различаются абсолютным URL-адресом запроса, включая схему, хост, путь и строку запроса. Например, URL - часть ключа кэша теперь генерируется из
, https://www.example.com/path/to/?key=val
а не /path/to/?key=val
. Ключи кеша, сгенерированные Django 1.7, будут отличаться от ключей, сгенерированных более старыми версиями Django. После обновления до Django 1.7 первый запрос к любому ранее кэшированному URL-адресу будет промахом в кеше.
Переход None
на Manager.db_manager()
¶
В предыдущих версиях Django можно было использовать
db_manager(using=None)
экземпляр диспетчера моделей для получения экземпляра диспетчера с использованием поведения маршрутизации по умолчанию, отменяя любую заданную вручную маршрутизацию базы данных. В Django 1.7 значение, None
переданное в db_manager, создаст маршрутизатор, который сохраняет любую назначенную вручную маршрутизацию базы данных - менеджер не будет сброшен. Это было необходимо для устранения несоответствия в способе каскадной передачи информации о маршрутизации через соединения. См. # 13724 для более подробной информации.
pytz может потребоваться ¶
Если ваш проект обрабатывает даты до 1970 года или после 2037 года, а Django вызывает их ValueError
при обнаружении, вам придется установить pytz . Эта проблема может возникнуть при использовании форматов даты Django, связанных с часовыми поясами, или django.contrib.syndication
.
Стратегия перенаправления входа администратора ¶
Исторически сложилось так, что сайт администратора Django передавал запрос от неавторизованного или не прошедшего проверку подлинности пользователя непосредственно в представление входа в систему без перенаправления HTTP. В Django 1.7 это поведение изменилось, чтобы соответствовать более традиционному рабочему процессу, при котором любой неавторизованный запрос на страницу администратора будет перенаправлен (с помощью кода состояния HTTP 302) на страницу входа с next
параметром, установленным на путь ссылки. Пользователь будет перенаправлен туда после успешного входа в систему.
Также обратите внимание, что форма входа в систему администратора была обновлена, чтобы не содержать
this_is_the_login_form
поля (теперь не используется), а ValidationError
код был установлен на более обычный invalid_login
ключ.
select_for_update()
требуется транзакция ¶
Исторически запросы с использованием select_for_update()
могли выполняться в режиме автоматической фиксации вне транзакции. До Django 1.6 автоматический режим транзакций Django позволял блокировать элементы до следующей операции записи. Django 1.6 представляет автоматическую фиксацию на уровне базы данных; с тех пор работа в таком контексте сводит на нет эффект select_for_update()
. Таким образом, теперь предполагается, что это ошибка, и возникает исключение.
Это изменение было внесено, потому что такие ошибки могут быть вызваны включением приложения, которое ожидает глобальные транзакции (например, с ATOMIC_REQUESTS
установленным значением True
), или старым поведением автоматической фиксации Django, в проект, который работает без них; и, кроме того, такие ошибки могут проявляться как ошибки повреждения данных. Это также было сделано в Django 1.6.3.
Это изменение может вызвать сбои теста, если вы используете select_for_update()
в тестовом классе, который является подклассом TransactionTestCase
вместо TestCase
.
Промежуточное ПО Contrib удалено из дефолта MIDDLEWARE_CLASSES
¶
Приложение заряжание рефакторинг
осуждается с использованием моделей из приложений , которые не являются частью
INSTALLED_APPS
установки. Это выявило несовместимость между значениями по умолчанию INSTALLED_APPS
и MIDDLEWARE_CLASSES
глобальными значениями по умолчанию ( django.conf.global_settings
). Довести диссертацию в настройках синхронизации и предотвратить предупреждения устаревания профилактики Когда делать вещи , как тестирование повторно используемых приложений с минимальными настройками,
SessionMiddleware
,
AuthenticationMiddleware
и
MessageMiddleware
были удалены из значения по умолчанию. Эти классы по-прежнему будут включены в настройки по умолчанию, созданные с помощью startproject
. Это изменение не повлияет на большинство проектов, но если вы ранее не заявляли
MIDDLEWARE_CLASSES
в настройках вашего проекта и полагаясь на глобальное значение по умолчанию, вы должны убедиться, что новые значения по умолчанию соответствуют потребностям вашего проекта. Вы также должны проверить любой код, который обращается
django.conf.global_settings.MIDDLEWARE_CLASSES
напрямую.
Разное ¶
Теперь
django.core.files.uploadhandler.FileUploadHandler.new_file()
методу передается дополнительныйcontent_type_extra
параметр. Если у вас есть кастом,FileUploadHandler
который реализуетnew_file()
, убедитесь, что он принимает этот новый параметр.ModelFormSet
s больше не удаляют экземпляры приsave(commit=False)
вызове. См.can_delete
Инструкции по удалению объектов из удаленных форм вручную.Загрузка пустых приборов приводит к появлению сообщения,
RuntimeWarning
а не к повышениюCommandError
.django.contrib.staticfiles.views.serve()
теперь будет вызыватьHttp404
исключение, а неImproperlyConfigured
когдаDEBUG
естьFalse
. Это изменение устраняет необходимость условного добавления представления в корневой URLconf, что, в свою очередь, делает безопасным обратное изменение по имени. Он также исключает возможность для посетителей генерировать ложные ошибки HTTP 500, запрашивая статические файлы, которые не существуют или еще не были собраны.Теперь
django.db.models.Model.__eq__()
метод определен таким образом, что экземпляры прокси-модели и ее базовой модели считаются равными при совпадении первичных ключей. Ранее только экземпляры одного и того же класса считались равными при совпадении первичного ключа.django.db.models.Model.__eq__()
Метод изменился таким образом, что дваModel
экземпляра без значений первичного ключа не будет считаться равными (если они не являются таким же экземпляром).Теперь
django.db.models.Model.__hash__()
метод будет повышатьсяTypeError
при вызове экземпляра без значения первичного ключа. Это сделано, чтобы избежать изменяемых__hash__
значений в контейнерах.AutoField
столбцы в базах данных SQLite теперь будут создаваться с использованиемAUTOINCREMENT
опции, которая гарантирует монотонное приращение. Это приведет к изменению поведения нумерации первичных ключей в SQLite, которое станет согласованным с большинством других баз данных SQL. Это будет применяться только к вновь созданным таблицам. Если у вас есть база данных, созданная с помощью более старой версии Django, вам нужно будет перенести ее, чтобы воспользоваться этой функцией. Например, вы можете сделать следующее:django.contrib.auth.models.AbstractUser
больше не определяетget_absolute_url()
метод. Возвращено старое определение, которое было произвольным, поскольку приложения могут определять или не определять такой URL-адрес в . Определите метод для вашего собственного пользовательского объекта или используйте, если вам нужен URL-адрес для вашего пользователя."/users/%s/" % urlquote(self.username)
urlpatterns
get_absolute_url()
ABSOLUTE_URL_OVERRIDES
Функциональность
django.test.LiveServerTestCase
класса по обслуживанию статических ресурсов была упрощена: теперь он может обслуживать только уже присутствующий контентSTATIC_ROOT
при запуске тестов. Способность прозрачно обслуживать все статические ресурсы (аналогично тому, что есть во время разработки) была перемещена в новый класс, который живет в приложении (тот, который поддерживает функцию Actually such) . Другими словами, сам по себе менее мощный, но в то же время в нем меньше магии.DEBUG = True
staticfiles
django.contrib.staticfiles.testing.StaticLiveServerTestCase
LiveServerTestCase
Обоснованием этого является устранение зависимости кода, не относящегося к Contrib, от приложений contrib.
Старый синтаксис URI кэша (например
"locmem://"
) больше не поддерживается. Он по-прежнему работал, хотя не был документирован и официально не поддерживался. Если вы все еще используете его, обновитеCACHES
синтаксис до текущего .Порядок
Form
полей по умолчанию в случае наследования изменен, чтобы соответствовать обычному Python MRO. Поля теперь обнаруживаются путем повторения MRO в обратном порядке, причем последним идет самый верхний класс. Это повлияет на вас только в том случае, если вы полагались на порядок полей по умолчанию, имея поля, определенные как для текущего класса, так и для родительскогоForm
.required
АргументSelectDateWidget
был удален. Этот виджет теперь учитываетis_required
атрибут поля формы, как и другие виджеты.Widget.is_hidden
теперь является свойством только для чтения, значение которого определяется путем самоанализа наличия .input_type == 'hidden'
select_related()
now связывается так же, как и другие подобные вызовы, напримерprefetch_related
. То есть эквивалентно . Ранее последнее было бы эквивалентом .select_related('foo', 'bar')
select_related('foo').select_related('bar')
select_related('bar')
GeoDjango прекращает поддержку GEOS <3.1.
init_connection_state
Метод движков баз данных в настоящее время выполняется в режиме автоматической фиксации (если не установленAUTOCOMMIT
вFalse
). Если вы поддерживаете собственный сервер базы данных, вам следует проверить этот метод.django.db.backends.BaseDatabaseFeatures.allows_primary_key_0
Атрибут был переименован ,allows_auto_pk_0
чтобы лучше описать его. ЭтоTrue
для всех баз данных, включенных в Django, за исключением MySQL, который разрешает первичные ключи со значением 0. Он запрещает автоинкремент только первичных ключей со значением 0.Затенение полей модели, определенных в родительской модели, запрещено, поскольку это создает неоднозначность в ожидаемом поведении модели. Кроме того, конфликтующие поля в иерархии наследования модели приводят к ошибке проверки системы. Например, если вы используете множественное наследование, вам необходимо определить настраиваемые поля первичного ключа в родительских моделях, иначе
id
поля по умолчанию будут конфликтовать. Подробнее см. Множественное наследование .django.utils.translation.parse_accept_lang_header()
теперь возвращает языковые стандарты в нижнем регистре вместо того, как это было предусмотрено. Поскольку языковые стандарты следует обрабатывать без учета регистра, это позволяет нам ускорить определение языковых стандартов.django.utils.translation.get_language_from_path()
иdjango.utils.translation.trans_real.get_supported_language_variant()
теперь уже нетsupported
аргументов.shortcut
Вид вdjango.contrib.contenttypes.views
теперь поддерживает протокол-относительный URL - адресов (например//example.com
).GenericRelation
теперь поддерживает необязательныйrelated_query_name
аргумент. Настройкаrelated_query_name
добавляет отношение связанного объекта обратно к типу контента для фильтрации, упорядочивания и других операций запроса.При запуске тестов на PostgreSQL
USER
потребуется доступ для чтения к встроеннойpostgres
базе данных. Это заменяет предыдущее поведение при подключении к фактической не тестовой базе данных.В рамках проверки системы базы , поля, модель и менеджеры модели все реализовать
check()
метод , который зарегистрирован с контрольной рамкой. Если у вас есть существующий метод, вызываемыйcheck()
для одного из этих объектов, вам необходимо переименовать его.Как отмечалось выше в разделе «Кэш» раздела «Незначительные функции», определение
TIMEOUT
аргументаCACHES
параметра asNone
установит ключи кеша как «бессрочные». Раньше с бэкэндом memcache aTIMEOUT
of0
устанавливал ключи с неограниченным сроком действия, но это несовместимо с поведением set-and-expire (то есть без кеширования) . Если вам нужны ключи с неограниченным сроком действия, обновите свои настройки, чтобы использовать их вместо того, чтобы последний теперь также обозначает в настройках срок действия и истечения срока действия.set("key", "value", timeout=0)
None
0
Эти
sql*
команды управления в настоящее время соблюдатьallow_migrate()
методDATABASE_ROUTERS
. Если у вас есть модели, синхронизированные с базами данных, отличными от стандартных, используйте--database
флаг, чтобы получить SQL для этих моделей (раньше они всегда включались в вывод).Декодирование строки запроса из URL-адресов теперь возвращается к кодировке ISO-8859-1, когда ввод не является допустимым UTF-8.
При добавлении
django.contrib.auth.middleware.SessionAuthenticationMiddleware
к шаблону проекта по умолчанию (только до версии 1.7.2) база данных должна быть создана перед доступом к странице с использованиемrunserver
.Добавление
schemes
аргумента кURLValidator
будет отображаться как изменение с обратной несовместимостью, если вы ранее использовали настраиваемое регулярное выражение для проверки схем. Любая схема, не указанная в списке, неschemes
пройдет проверку, даже если регулярное выражение соответствует заданному URL.
Функции, устаревшие в версии 1.7 ¶
django.core.cache.get_cache
¶
django.core.cache.get_cache
был заменен на
django.core.cache.caches
.
django.utils.dictconfig
/ django.utils.importlib
¶
django.utils.dictconfig
и django.utils.importlib
были копиями соответственно logging.config
и importlib
предоставлялись для версий Python до 2.7. Они устарели.
django.utils.module_loading.import_by_path
¶
Текущая django.utils.module_loading.import_by_path
функция перехватывает AttributeError
, ImportError
и ValueError
исключения, и повторно поднимает ImproperlyConfigured
. Такое маскирование исключений излишне усложняет диагностику проблем циклического импорта, поскольку создает впечатление, что проблема исходит изнутри Django. Он устарел и заменен на
import_string()
.
django.utils.tzinfo
¶
django.utils.tzinfo
предоставил два tzinfo
подкласса
LocalTimezone
и FixedOffset
. Они устарели в пользу более правильных альтернатив, предоставляемых django.utils.timezone
,
django.utils.timezone.get_default_timezone()
и
django.utils.timezone.get_fixed_timezone()
.
django.utils.unittest
¶
django.utils.unittest
предоставил единый доступ к unittest2
библиотеке на всех версиях Python. Поскольку он unittest2
стал unittest
модулем стандартной библиотеки
в Python 2.7, а Django 1.7 отказался от поддержки более старых версий Python, этот модуль больше не полезен. Он устарел. unittest
Вместо этого используйте
.
django.utils.datastructures.SortedDict
¶
Поскольку он OrderedDict
был добавлен в стандартную библиотеку в Python 2.7, SortedDict
больше не требуется и устарел.
Два дополнительных устаревших метода, предоставленные SortedDict
( insert()
и value_for_index()
), были удалены. Если вы полагались на эти методы для изменения структур, таких как поля формы, теперь вы должны рассматривать их OrderedDict
как неизменяемые объекты и переопределять их для изменения их содержимого.
Например, вы можете захотеть переопределить MyFormClass.base_fields
(хотя этот атрибут не считается публичным API), чтобы изменить порядок полей для всех MyFormClass
экземпляров; или аналогично, вы можете переопределить
self.fields
изнутри MyFormClass.__init__()
, чтобы изменить поля для определенного экземпляра формы. Например (из самого Django):
PasswordChangeForm.base_fields = OrderedDict(
(k, PasswordChangeForm.base_fields[k])
for k in ['old_password', 'new_password1', 'new_password2']
)
Расположение пользовательского SQL для пакета моделей ¶
Раньше, если модели были организованы в виде package ( myapp/models/
), а не просто myapp/models.py
, Django искал исходные данные SQL в
myapp/models/sql/
. Эта ошибка была исправлена, поэтому Django будет выполнять поиск myapp/sql/
в соответствии с документацией. После исправления этой проблемы были добавлены миграции, которые не рекомендуют исходные данные SQL. Таким образом, хотя это изменение все еще существует, исключение не имеет значения, поскольку вся функция будет удалена в Django 1.9.
Реорганизация django.contrib.sites
¶
django.contrib.sites
обеспечивает ограниченную функциональность, когда его нет
INSTALLED_APPS
. Рефакторинг загрузки приложения добавляет некоторые ограничения в этой ситуации. Как следствие, два объекта были перемещены, а старые местоположения устарели:
RequestSite
сейчас живет вdjango.contrib.sites.requests
.get_current_site()
сейчас живет вdjango.contrib.sites.shortcuts
.
атрибут declared_fieldsets
в ModelAdmin
¶
ModelAdmin.declared_fieldsets
устарела. Несмотря на то, что он является частным API, он будет устаревшим. Этот атрибут в основном использовался обходными методами, ModelAdmin.get_fieldsets()
но это считалось ошибкой и было исправлено.
Реорганизация django.contrib.contenttypes
¶
Поскольку django.contrib.contenttypes.generic
определены объекты, связанные как с администратором, так и с моделью, импорт этого модуля может вызвать неожиданные побочные эффекты. Как следствие, его содержимое было разбито на contenttypes
подмодули, и django.contrib.contenttypes.generic
модуль устарел:
GenericForeignKey
аGenericRelation
теперь живем вfields
.BaseGenericInlineFormSet
аgeneric_inlineformset_factory()
теперь живем вforms
.GenericInlineModelAdmin
,GenericStackedInline
аGenericTabularInline
теперь живем вadmin
.
syncdb
¶
syncdb
Команда устарела в пользу новой migrate
команды. migrate
принимает те же аргументы, что и syncdb
раньше, плюс еще несколько, поэтому безопасно просто изменить имя, которое вы вызываете, и ничего больше.
модули util
переименованы в utils
¶
Следующие экземпляры util.py
в кодовой базе Django были переименованы utils.py
в, чтобы объединить все ссылки на util и utils:
django.contrib.admin.util
django.contrib.gis.db.backends.util
django.db.backends.util
django.forms.util
метод get_formsets
в ModelAdmin
¶
ModelAdmin.get_formsets
устарел в пользу нового
get_formsets_with_inlines()
, чтобы лучше справиться со случаем выборочного отображения строк на ModelAdmin
.
IPAddressField
¶
django.db.models.IPAddressField
И django.forms.IPAddressField
поля были устаревшими в пользу
django.db.models.GenericIPAddressField
и
django.forms.GenericIPAddressField
.
BaseMemcachedCache._get_memcache_timeout
метод ¶
BaseMemcachedCache._get_memcache_timeout()
Метод был переименован в
get_backend_timeout()
. Несмотря на то, что это частный API, он будет устаревшим.
Параметры сериализации естественного ключа ¶
В --natural
и -n
варианты dumpdata
устарели. Вместо этого используйте .dumpdata --natural-foreign
Точно так же use_natural_keys
аргумент for serializers.serialize()
устарел. use_natural_foreign_keys
Вместо этого используйте .
Сращивание POST
и GET
аргументы в WSGIRequest.REQUEST
¶
Уже было настоятельно рекомендовано использовать GET
и POST
вместо
REQUEST
, потому что первые более явны. Это свойство REQUEST
устарело и будет удалено в Django 1.9.
класс django.utils.datastructures.MergeDict
¶
MergeDict
существует в первую очередь для поддержки слияния POST
и GET
аргументов в REQUEST
свойство WSGIRequest
. Для объединения словарей используйте dict.update()
вместо них. Этот класс MergeDict
устарел и будет удален в Django 1.9.
Языковые коды zh-cn
, zh-tw
и fy-nl
¶
Используемые в настоящее время коды языков для упрощенного китайского zh-cn
, традиционный китайский zh-tw
и (западной) Frysian fy-nl
устарели и должны быть заменены кодами языков zh-hans
, zh-hant
и
fy
соответственно. Если вы используете эти языковые коды, вам следует переименовать каталоги локалей и обновить настройки, чтобы отразить эти изменения. Устаревшие языковые коды будут удалены в Django 1.9.
функция django.utils.functional.memoize
¶
Функция memoize
устарела и должна быть заменена
functools.lru_cache
декоратором (доступен начиная с Python 3.2).
Django предоставляет бэкпорт этого декоратора для более старых версий Python, и он доступен по адресу django.utils.lru_cache.lru_cache
. Устаревшая функция будет удалена в Django 1.9.
Гео Sitemap ¶
Google больше не поддерживает формат Geo Sitemaps. Следовательно, поддержка Django для файлов Geo Sitemaps устарела и будет удалена в Django 1.8.
Передача вызываемых аргументов в методы набора запросов ¶
Вызываемые аргументы для наборов запросов были недокументированной функцией, которая была ненадежной. Он устарел и будет удален в Django 1.9.
Вызываемые аргументы оценивались при построении набора запросов, а не при его оценке, поэтому эта функция не давала никаких преимуществ по сравнению с оценкой аргументов перед их передачей в набор запросов и создавала путаницу, что аргументы могли быть оценены во время запроса.
настройка ADMIN_FOR
¶
Эта ADMIN_FOR
функция, являющаяся частью админдока, была удалена. Вы можете удалить этот параметр из своей конфигурации по своему усмотрению.
SplitDateTimeWidget
с DateTimeField
¶
SplitDateTimeWidget
поддержка в DateTimeField
осуждается, использование SplitDateTimeWidget
с
SplitDateTimeField
вместо этого.
django.core.management.BaseCommand
¶
requires_model_validation
устарел в пользу нового
requires_system_checks
флага. Если последний флаг отсутствует, то используется значение первого флага. Определение обоих requires_system_checks
и
requires_model_validation
приводит к ошибке.
Метод check()
заменил старый метод validate()
.
ModelAdmin
валидаторы ¶
ModelAdmin.validator_class
И default_validator_class
атрибуты являются устаревшими в пользу нового checks_class
атрибута.
ModelAdmin.validate()
Метод является устаревшим в пользу
ModelAdmin.check()
.
django.contrib.admin.validation
Модуль является устаревшим.
django.db.backends.DatabaseValidation.validate_field
¶
Этот метод устарел и заменен новым check_field
. Функциональность, требуемая для, check_field()
такая же, как и предоставляемая validate_field()
, но формат вывода отличается. Сторонние серверные части баз данных, нуждающиеся в этой функции, должны предоставлять реализацию
check_field()
.
Загрузка тегов ssi
и url
шаблонов из future
библиотеки ¶
Django 1.3 введен и
синтаксис для прямой совместимости
и шаблонных тегов. Этот синтаксис устарел и будет удален в Django 1.9. Вы можете просто удалить
теги.{% load ssi from future %}
{% load url from future %}
ssi
url
{% load ... from future %}
django.utils.text.javascript_quote
¶
javascript_quote()
была недокументированной функцией, присутствующей в django.utils.text
. Он использовался внутри javascript_catalog()
представления, реализация которого была изменена для использования json.dumps()
вместо него. Если вы полагались на эту функцию для обеспечения безопасного вывода из ненадежных строк, вам следует использовать фильтр django.utils.html.escapejs
или
escapejs
шаблон. Если все, что вам нужно, это создать допустимые строки JavaScript, вы можете просто использовать
json.dumps()
.
fix_ampersands
utils метод и шаблонный фильтр ¶
Этот django.utils.html.fix_ampersands
метод и fix_ampersands
шаблонный фильтр устарели, так как об экранировании амперсандов уже позаботились стандартные функции экранирования HTML Django. Комбинирование этого с fix_ampersands
может привести либо к двойному экранированию, либо, если вывод считается безопасным, к риску внедрения XSS-уязвимостей. Наряду с fix_ampersands
,
django.utils.html.clean_html
осуждается, недокументированная функция звонков
fix_ampersands
. Поскольку это ускоренное устаревания, fix_ampersands
и clean_html
будут удалены в Django 1.8.
Реорганизация настроек теста базы данных ¶
Все настройки базы данных с TEST_
префиксом устарели и заменены записями в TEST
словаре в настройках базы данных. Старые настройки будут поддерживаться до Django 1.9. Для обратной совместимости со старыми версиями Django вы можете определить обе версии настроек, если они совпадают.
Поддержка FastCGI ¶
Поддержка FastCGI с помощью команды runfcgi
управления будет удалена в Django 1.9. Разверните свой проект с помощью WSGI.
Перемещенные объекты в contrib.sites
¶
После рефакторинга загрузки приложения django.contrib.sites.models
необходимо переместить два объекта,
поскольку они должны быть доступны без импорта, django.contrib.sites.models
если
django.contrib.sites
не установлены. Импорт RequestSite
из
django.contrib.sites.requests
и get_current_site()
из
django.contrib.sites.shortcuts
. Старые локации импорта будут работать до Django 1.9.
django.forms.forms.get_declared_fields()
¶
Django no longer uses this functional internally. Even though it’s a private API, it’ll go through the normal deprecation cycle.
Private Query Lookup APIs¶
Private APIs django.db.models.sql.where.WhereNode.make_atom()
and
django.db.models.sql.where.Constraint
are deprecated in favor of the new
custom lookups API.
Features removed in 1.7¶
These features have reached the end of their deprecation cycle and are removed in Django 1.7. See Features deprecated in 1.5 for details, including how to remove usage of these features.
django.utils.simplejson
est supprimé.django.utils.itercompat.product
est supprimé.- INSTALLED_APPS and TEMPLATE_DIRS are no longer corrected from a plain string into a tuple.
HttpResponse
,SimpleTemplateResponse
,TemplateResponse
,render_to_response()
,index()
, andsitemap()
no longer take amimetype
argumentHttpResponse
immediately consumes its content if it’s an iterator.- Параметр
AUTH_PROFILE_MODULE
иget_profile()
метод модели User удалены. - Порядок управления
cleanup
удален. - Скрипт
daily_cleanup.py
удален. select_related()
больше не имеетdepth
аргумента ключевого слова.- Функции
get_warnings_state()
/restore_warnings_state()
изdjango.test.utils
иsave_warnings_state()
/restore_warnings_state()
django.test. * TestCase удалены. check_for_test_cookie
МетодAuthenticationForm
удаляется.- Версия
django.contrib.auth.views.password_reset_confirm()
, поддерживающая идентификаторы пользователей в кодировке base36 (django.contrib.auth.views.password_reset_confirm_uidb36
), удалена. django.utils.encoding.StrAndUnicode
Смесь в удаляется.