Примечания к выпуску 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 импортирует все конфигурации и модели приложений сразу после запуска, используя детерминированный и простой процесс. Это должно упростить диагностику проблем импорта, таких как петли импорта.
Новый метод для подклассов полей ¶
Чтобы помочь власти как схемы миграции и позволяет облегчить добавление составных ключей в выпусках будущих Джанго, то
Field
API теперь имеет новый необходимый метод:
deconstruct()
.
Этот метод не принимает аргументов и возвращает кортеж из четырех элементов:
name
: Имя атрибута поля в его родительской модели или,None
если оно не является частью моделиpath
: Пунктирный путь Python к классу этого поля, включая имя класса.args
: Позиционные аргументы в виде спискаkwargs
: Аргументы ключевого слова, как dict
Эти четыре значения позволяют сериализовать любое поле в файл, а также позволяют безопасно копировать поле, что является неотъемлемой частью этих новых функций.
Это изменение не должно повлиять на вас, если вы не пишете собственные подклассы полей; если вы это сделаете, вам может потребоваться переопределить 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
класс и все методы , которые были желательные на должныManager
были быть проксированном к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()
¶
Раньше было два основных шаблона обработки ошибок в формах:
- Воспитывающей
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
которые будут доступны для интерполирования в сообщение об ошибке (см Raising 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
теперь используютborder-radius
свойство CSS для закругленных углов, а не фоновые изображения 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
что использование куков, теперь будут следовать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
¶
- Теперь используют
для установки
заголовка в ответ. Это позволяет
обрабатывать условные запросы для файлов Sitemap, которые установлены .
sitemap framework
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
¶
- Элемент
Atom1Feed
фида синдикацииupdated
теперь используетupdateddate
вместоpubdate
, позволяяpublished
включить элемент в фид (который полагаетсяpubdate
).
Кэш ¶
- Доступ к настроенным кешам
CACHES
теперь доступен черезdjango.core.cache.caches
. Этот dict-подобный объект предоставляет отдельный экземпляр для каждого потока. Он заменяет то,django.core.cache.get_cache()
что сейчас устарело. - Если вы создаете экземпляры бэкэндов кеша напрямую, имейте в виду, что они больше не являются потокобезопасными, поскольку
django.core.cache.caches
теперь выдают разные экземпляры для каждого потока. - Если задать
TIMEOUT
аргументCACHES
параметра asNone
, ключи кеша будут по умолчанию иметь значение «без истечения срока действия». Раньше можно было перейти только к методуtimeout=None
серверной части кешаset()
.
Подделка межсайтовых запросов ¶
- Этот
CSRF_COOKIE_AGE
параметр упрощает использование файлов cookie CSRF на основе сеанса.
Электронная почта ¶
send_mail()
теперь принимаетhtml_message
параметр для отправки составного текстового / простого и текстового / 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"
и т. д.), чтобы предотвратить атаку типа «отказ в обслуживании». Это изменение также было внесено в выпуски безопасности 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 теперь снова можно заставить
метод возвращать произвольное значение.
TypedChoiceField
coerce
SelectDateWidget.months
можно использовать для настройки формулировки месяцев, отображаемых в виджете выбора.- Параметры
min_num
иvalidate_min
были добавлены дляformset_factory()
проверки минимального количества отправленных форм. - Метаклассы, используемые
Form
иModelForm
были переработаны для поддержки большего количества сценариев наследования. Предыдущее ограничение, которое препятствовало наследованию от обоихForm
иModelForm
одновременно, было снято до тех пор, пока оноModelForm
появляется первым в MRO. - Теперь можно удалить поле из
Form
класса при создании подкласса, задав для имени значениеNone
. - Теперь можно настроить сообщения об ошибках для
ModelForm
«Sunique
,unique_for_date
иunique_together
ограничений. Чтобы поддержатьunique_together
или любой другойNON_FIELD_ERROR
,ModelForm
теперь ищетNON_FIELD_ERROR
ключ вerror_messages
словареModelForm
внутреннегоMeta
класса. Для получения более подробной информации см. Соображения относительно error_messages модели .
Интернационализация ¶
django.middleware.locale.LocaleMiddleware.response_redirect_class
Атрибут позволяет настроить переадресацию , выпущенную ИМ.LocaleMiddleware
Теперь хранит выбранный язык пользователя с помощью ключа сеанса_language
. Доступ к нему можно получить только с помощьюLANGUAGE_SESSION_KEY
константы. Раньше он хранился с ключом,django_language
аLANGUAGE_SESSION_KEY
константа не существовала, но ключи, зарезервированные для Django, должны начинаться с подчеркивания. Для обратной совместимостиdjango_language
все еще читается в 1.7. Сеансы будут перенесены на новый ключ по мере их написания.blocktrans
Тег теперь поддерживаетtrimmed
опцию. Эта опция удалит символы новой строки из начала и конца содержимого тега, заменит любые пробелы в начале и конце строки и объединит все строки в одну, используя пробел для их разделения. Это очень полезно для отступа содержимого тега, чтобы символы отступа не попадали в соответствующую запись в PO-файле, что упрощает процесс перевода.{% blocktrans %}
{% 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()
Метод был добавлен.- Новая опция
default_permissions
моделиMeta
позволяет вам настроить (или отключить) создание разрешений на добавление, изменение и удаление по умолчанию. - Явное наследование
OneToOneField
для нескольких таблиц теперь обнаруживается в абстрактных классах. - Теперь можно избежать создания обратной связи для
OneToOneField
, задав для нееrelated_name
значение'+'
или завершив его на'+'
. F expressions
поддержите оператор мощности (**
).- В
remove()
иclear()
методы соответствующих менеджеров , созданных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
в'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 (); мы расширили документацию по настраиваемым полям инструкциями по реализации этого метода .
Требование, чтобы все аргументы поля были сериализуемыми, означает, что любые экземпляры настраиваемых классов, передаваемые в конструкторы полей - например, такие как настраиваемые подклассы хранилища - также должны иметь метод деконструкции, определенный для них , хотя Django предоставляет удобный декоратор классов, который будет работать для большинства приложений.
Изменения загрузки приложений ¶
Последовательность запуска ¶
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
при запуске тестов. Способность прозрачно обслуживать все статические активы (подобно тому , что один получает с в развитии времени) был перемещен в новый класс , который живет в применении (один на самом деле отвечает за такую функцию): . Другими словами, сам по себе менее мощный, но в то же время в нем меньше магии.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 больше не использует этот функционал внутри компании. Несмотря на то, что это частный API, он пройдет стандартный цикл устаревания.
API поиска частных запросов ¶
Частные API django.db.models.sql.where.WhereNode.make_atom()
и
django.db.models.sql.where.Constraint
устарели в пользу нового
API пользовательского поиска .
Функции удалены в версии 1.7 ¶
Эти функции достигли конца цикла устаревания и удалены в Django 1.7. См. Подробности в разделе « Функции, не рекомендуемые в версии 1.5» , в том числе о том, как отключить использование этих функций.
django.utils.simplejson
устранен.django.utils.itercompat.product
устранен.- INSTALLED_APPS и TEMPLATE_DIRS больше не исправляются из простой строки в кортеж.
HttpResponse
,SimpleTemplateResponse
,TemplateResponse
,render_to_response()
,index()
, Иsitemap()
больше не приниматьmimetype
аргументHttpResponse
немедленно потребляет свое содержимое, если это итератор.- Параметр
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
Смесь в удаляется.