- PVSM.RU - https://www.pvsm.ru -
В данном посте представлен обзор новшеств и особенностей популярного среди Python разработчиков фреймворка Django 1.7. Релиз позиционируется как сообществом, так и основными разработчиками — как наиболее значимый релиз, с момента выхода в свет Django 1.0.
Прекращение поддержки Python 2.6. Теперь поддерживается версия Python 2.7 и выше. Заявлена поддержка Python 3.4.
Добавлена нативная поддержка миграций [1] непосредственно в сам фреймворк. Можно поблагодарить за это автора популярной батарейки South — Andrew Godwin-а [2].
Команда syncdb обьявлена как устаревшая, и скорее всего будет удалена в дальнейшем. Пока еще работает так же, как и прежде.
Фикстуры initial_data более не инициализируются по умолчанию для приложений с миграциями. Предлагается воспользоваться загрузкой фикстур на уровне самих миграций.
Механизм загрузки приложения [3] — был подвергнут полному рефакторингу. В результате можно отказаться от models.py, который ранее идентифицировал приложение и был обязательным.
Новые методы подклассов Field [4]. Главная особенность — это обязательный метод deconstruct(). К сожалению в этом вина включения миграций в состав Django. Если Вы наследуетесь от стандартных полей и не переопределяете метод __init__, то заботиться Вам об этом не придется.
Появилась возможность вызовов QuerySet-ов [5] напрямую из менеджера:
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()
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()
Новая система, для проверки проекта(System check), которая при запуске опеделяет проблемы и подсказывает что и как необходимо исправить. Для проверки, используется новая команда check, пришедшая на замену устаревшей команде validate.
Новый Prefetch [6] для продвинутых операций prefetch_related. Теперь можно настроить предварительную выборку используя QuerySet-ы.
Поддержка текущего часового пояса в панели администратора, при работе с виджетом даты. Прежде использовался часовой пояс браузера. При расхождении времени в браузере и на сервере — выводится визуальная подсказка.
Курсор баз данных, теперь может использоваться в качестве контекст менеджера, что является сокращением для:
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
Возможность определения собственных типов поиска [7], для фильтрации при использовании ORM.
from django.db.models import IntegerField
from django.db.models import Transform
class AbsoluteValue(Transform):
lookup_name = 'abs'
def as_sql(self, qn, connection):
lhs, params = qn.compile(self.lhs)
return "ABS(%s)" % lhs, params
IntegerField.register_lookup(AbsoluteValue)
# Использование
Experiment.objects.filter(change__abs=27)
# В результате получим
# SELECT ... WHERE ABS("experiments"."change") = 27
django.contrib.admin
django.contrib.auth
django.contrib.sites
Загрузка файлов
Формы
Интернационализация
Команды управления
Модели
Запросы и ответы
Утилиты
Данный пост является вольным интерпретированием официальной документации находящейся в стадии разработки, и носит исключительно ознакомительный характер.
В него включены наиболее интересные вещи с точки зрения автора поста. Для более подробного и детального ознакомления, можно
перейти на страницу документации [41].
Автор: gotlium
Источник [42]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/django-2/60793
Ссылки в тексте:
[1] миграций: https://docs.djangoproject.com/en/dev/topics/migrations/
[2] Andrew Godwin-а: https://github.com/andrewgodwin
[3] загрузки приложения: https://docs.djangoproject.com/en/dev/ref/applications/
[4] Field: https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field
[5] QuerySet-ов: https://docs.djangoproject.com/en/dev/topics/db/managers/#create-manager-with-queryset-methods
[6] Prefetch: https://docs.djangoproject.com/en/dev/ref/models/queries/#django.db.models.Prefetch
[7] типов поиска: https://docs.djangoproject.com/en/dev/ref/models/custom-lookups/#django.db.models.Lookup
[8] собственные: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header
[9] ModelAdmin.get_fields(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_fields
[10] декоратор register(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.register
[11] ModelAdmin.list_display_links: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links
[12] ModelAdmin.view_on_site: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.view_on_site
[13] ModelAdmin.list_display: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display
[14] ModelAdmin.get_changeform_initial_data(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_changeform_initial_data
[15] email_user(): https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.email_user
[16] send_mail(): https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.send_mail
[17] permission_required(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.permission_required
[18] AuthenticationForm.confirm_login_allowed(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm.confirm_login_allowed
[19] django.contrib.auth.views.password_reset(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.views.password_reset
[20] AbstractBaseUser.get_session_auth_hash(): https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash
[21] AbstractBaseUser: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser
[22] django.contrib.sites.middleware.CurrentSiteMiddleware: https://docs.djangoproject.com/en/dev/ref/middleware/#django.contrib.sites.middleware.CurrentSiteMiddleware
[23] SMTP бекенд: https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.backends.smtp.EmailBackend
[24] тайм-аута: https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.backends.smtp.EmailBackend.timeout
[25] UploadedFile.content_type_extra: https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type_extra
[26] FILE_UPLOAD_DIRECTORY_PERMISSIONS: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FILE_UPLOAD_DIRECTORY_PERMISSIONS
[27] FILE_UPLOAD_PERMISSIONS: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FILE_UPLOAD_PERMISSIONS
[28] FileField.upload_to: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to
[29] django.middleware.locale.LocaleMiddleware.response_redirect_class: https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware.response_redirect_class
[30] LocaleMiddleware: https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware
[31] blocktrans: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#std:templatetag-blocktrans
[32] makemessages: https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-makemessages
[33] QuerySet.update_or_create(): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.update_or_create
[34] default_permissions: https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.default_permissions
[35] iexact: https://docs.djangoproject.com/en/dev/ref/models/querysets/#std:fieldlookup-iexact
[36] index_together: https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.index_together
[37] HttpRequest.scheme: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.scheme
[38] redirect(): https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.redirect
[39] JsonResponse: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.JsonResponse
[40] strip_tags(): https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.html.strip_tags
[41] документации: https://docs.djangoproject.com/en/dev/releases/1.7/
[42] Источник: http://habrahabr.ru/post/224249/
Нажмите здесь для печати.