SlideShare a Scribd company logo
Django Models
API
Создание и изменение объектов
from blog.models import Category, Post
# создание
c = Category(title="Perl")
c.save()
# или за один вызов
с = Category.objects.create(title="Python")
# изменение
c.title="About Python"
c.save()
2
Создание объектов со связями
from blog.models import Category, Post
t = Tag(title="easy"); t.save()
c = Category(title="Python"); c.save()
p = Post(title="Intro", text="...", category=c)
p.save()
p.tags = Tag.objects.all()[0:3] # [ Tag ]
p.save()
p.tags.add(t)
p.save()
3
Загрузка объекта из базы
# по ключу
try:
post = Post.objects.get(pk=3)
except Post.DoesNotExist:
post = None
# по другому полю
try:
post = Post.objects.get(name="Python")
except MultipleObjectsReturned:
post = None
4
Выборка нескольких объектов
all_posts = Post.objects.all()
first_three = Post.objects.all()[:3]
c = Category.objects.get(id=3)
python_posts = Post.objects.filter(category=c)
css_posts = Post.objects.filter(title__contains="css")
css_posts = css_posts.order_by('-rating')
css_posts = css_posts[10:20]
5
QuerySets
QuerySet
QuerySet - объекты, представляющие собой запрос к базе данных.
Именно запрос, а не его результаты. QuerySet являются
ленивыми (lazy) объектами. Это значит, что запрос
осуществляется не в момент создания QuerySet, а в момент
итерации по нему, либо вызова метода, возвращающего
результат.
7
Chaining
posts = Post.objects # ModelManager
posts = posts.filter(title__match="CSS") # QuerySet
posts = posts.exclude(category_id=7) # QuerySet
posts = posts.order_by('rating') # QuerySet
posts = posts.reverse() # QuerySet
posts = posts[0:10] # [ Post ]
8
Методы QuerySet (chaining)
•   filter , exclude - фильтрация, в SQL это WHERE
•   order_by - сортировка
•   annotate - выборка агрегатов, в SQL это JOIN и GROUP BY
•   values - выборка отдельных колонок, а не объектов
•   distinct - выборка уникальных значений
•   select_related , prefetch_related - выборка из нескольких
таблиц
9
Методы QuerySet (результат)
•   create - создание нового объекта
•   update - обновление всех подходящих объектов
•   delete - удаление всех подходящих объектов
•   get_or_create - выборка объекта или его создание
•   count - выборка количества COUNT(*)
•   get_or_create - выборка объекта или его создание
10
Синтаксис условий в QuerySet
В методах filter и exclude :
•   field = value - точное совпадение
•   field__contains = value - суффикс оператора LIKE
•   field__isnull , field__gt , field__lte
•   relation__field = value - условие по связанной таблице
•   category__title__contains = "Perl"
Названия полей и таблиц не могут содержать __ !
11
ModelManager
ModelManager
В модели содержатся методы для работы с одним объектом (одной
строкой). В ModelManager содержатся объекты для работы со
множеством объектов. ModelManager «по-умолчанию» содержит
все те же методы что QuerySet и используется для создания
QuerySet объектов связанных с данной моделью.
13
ModelManager «по-умолчанию»
class Post(models.Model):
title = models.CharField()
# ....
posts = Post.objects # Manager
posts = Post.objects.all() # QuerySet
posts = Post.objects.filter(id__gt=10) # QuerySet
14
Свой ModelManager
class PostManager(models.Manager):
def best_posts(self):
return self.filter(rating__gt=50)
def published(self):
return self.filter(published=True)
def create_draft(self, **kwargs):
kwargs['draft'] = True
return self.create(**kwargs)
class Post(models.Model):
title = models.CharField()
objects = PostManager()
posts = Post.objects # PostManager
15
RelatedManager
class Post(models.Model):
# ...
tags = models.ManyToManyField(Tag)
p1 = Post.objects.get(pk=3)
tags = p1.tags # RelatedManager
RelatedManager связан с конкретным объектом Post и во все
выборки будет добавлять условие post=p1
16
Методы RelatedManager
•   create(**kwargs) - создание нового тэга, связанного с постом
•   add(t2) - привязка существующего тэга t2 к текущему посту
•   remove(t2) - отвязка существующего тэга t2 от текущего поста
•   clear() - очистка списка тэгов у текущего поста
17
Миграции
Миграции
Миграция - это процедура изменения схемы базы данных для
приведения ее в соответствие с моделями.
Начиная с версии 1.7 Django поддерживает миграции на уровне
фреймворка.
19
Django миграции
•   ./manage.py makemigrations - анализ изменений в моделях и
создание миграций.
•   ./manage.py migrate - применение новых миграций к базе
данных.
➕ поддержка различных СУБД
➕ прямые и обратные миграции
➖ на практике часто неудобные или недостаточные
20
Свои миграции
project/migration/2015-08-08-more-post-fields.py
#!/usr/bin/python2.7
from django.core.management import setup_environ
from project import settings
setup_environ(settings)
from django.db import connection
cursor = connection.cursor()
cursor.execute("""
alter table blog_post add column is_best tinyint(1)
""");
21
Best practices
Fat controller
Типичная проблема начинающих разработчиков - размещение
логики в контроллерах. Это плохое решение, у которого есть имя -
антипаттерн Fat Controller.
Размещение логики в контроллере лишает вас возможности
использовать ее повторно. Всю бизнес-логику приложения следует
размещать в моделях.
23

More Related Content

What's hot (20)

PPTX
Web осень 2013 лекция 4
Technopark
 
PDF
Mongo db aggregation
Acceptic
 
PPT
Web осень 2012 лекция 4
Technopark
 
PDF
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
PPTX
Yii 2. Что нового?
yiiconf
 
PPTX
I tmozg js_school
ITmozg
 
PDF
Decorators' recipes
Yury Yurevich
 
PDF
Магия метаклассов
Andrey Zakharevich
 
PPT
Yserver
drupalconf
 
PDF
Что нового в Django 1.4
Илья Барышев
 
PDF
Python dict: прошлое, настоящее, будущее
delimitry
 
PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
PPTX
PHP and MySQL
Noveo
 
PPT
Толстая модель. История разработки ORM
Mikhail Shamin
 
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
PPT
Yii development
MageCloud
 
PPT
Web весна 2013 лекция 4
Technopark
 
PPT
Производительность в Django
MoscowDjango
 
PDF
Web осень 2013 лекция 2
Technopark
 
ODP
Работа с БД в Drupal 7
Eugene Fidelin
 
Web осень 2013 лекция 4
Technopark
 
Mongo db aggregation
Acceptic
 
Web осень 2012 лекция 4
Technopark
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
Yii 2. Что нового?
yiiconf
 
I tmozg js_school
ITmozg
 
Decorators' recipes
Yury Yurevich
 
Магия метаклассов
Andrey Zakharevich
 
Yserver
drupalconf
 
Что нового в Django 1.4
Илья Барышев
 
Python dict: прошлое, настоящее, будущее
delimitry
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
PHP and MySQL
Noveo
 
Толстая модель. История разработки ORM
Mikhail Shamin
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
Yii development
MageCloud
 
Web весна 2013 лекция 4
Technopark
 
Производительность в Django
MoscowDjango
 
Web осень 2013 лекция 2
Technopark
 
Работа с БД в Drupal 7
Eugene Fidelin
 

Viewers also liked (17)

PDF
16 - Web-технологии. Технология AJAX
Roman Brovko
 
PDF
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
PDF
14 - Web-технологии. Обработка форм
Roman Brovko
 
PDF
15 - Web-технологии. Сессии и авторизация
Roman Brovko
 
PDF
17 - Web-технологии. Real Time сообщения
Roman Brovko
 
PDF
03 - Установка Xcode
Roman Brovko
 
PDF
01 - Системные требования
Roman Brovko
 
PDF
02 - Установка macOS
Roman Brovko
 
PDF
01 - Web-технологии. Архитектура Web приложений
Roman Brovko
 
PDF
02 - Web-технологии. Web-клиенты
Roman Brovko
 
PDF
07 - Web-технологии. Web-сервера
Roman Brovko
 
PDF
04 - Практика UML. Описание прецедентов
Roman Brovko
 
PDF
Практический анализ и визуальное моделирование на UML
Nikolai Kireev
 
PDF
08 - Web-технологии. Архитектура frontend-backend
Roman Brovko
 
PDF
66 - Spring. Spring и JSF
Roman Brovko
 
PDF
06 - Web-технологии. Протокол HTTP
Roman Brovko
 
PDF
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
16 - Web-технологии. Технология AJAX
Roman Brovko
 
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
14 - Web-технологии. Обработка форм
Roman Brovko
 
15 - Web-технологии. Сессии и авторизация
Roman Brovko
 
17 - Web-технологии. Real Time сообщения
Roman Brovko
 
03 - Установка Xcode
Roman Brovko
 
01 - Системные требования
Roman Brovko
 
02 - Установка macOS
Roman Brovko
 
01 - Web-технологии. Архитектура Web приложений
Roman Brovko
 
02 - Web-технологии. Web-клиенты
Roman Brovko
 
07 - Web-технологии. Web-сервера
Roman Brovko
 
04 - Практика UML. Описание прецедентов
Roman Brovko
 
Практический анализ и визуальное моделирование на UML
Nikolai Kireev
 
08 - Web-технологии. Архитектура frontend-backend
Roman Brovko
 
66 - Spring. Spring и JSF
Roman Brovko
 
06 - Web-технологии. Протокол HTTP
Roman Brovko
 
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
Ad

Similar to 12 - Web-технологии. Django модели (20)

PDF
Лекция #7. Django ORM
Яковенко Кирилл
 
PPT
Введение в Django
Илья Барышев
 
PPT
Django шахрай. версия 4
smikler
 
PPTX
Web осень 2013 лекция 7
Technopark
 
PPTX
Web осень 2013 лекция 8
Technopark
 
PPTX
django-and-postgresql
Oleg Churkin
 
PDF
django cheBit'11
dva
 
PDF
Web осень 2013 лекция 6
Technopark
 
PPT
Web весна 2012 лекция 7
Technopark
 
PDF
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
it-people
 
PPTX
Python Meetup
iQSpace
 
PDF
Лекция #6. Введение в Django web-framework
Яковенко Кирилл
 
PDF
SQL. Django, начало
pelid
 
PPT
Мульти-доменность в Django проекте
Alexey Kinyov
 
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
PPTX
Drf vs Graphql
Вадим Шевченко
 
PPTX
Django Rest Framework vs Graph Ql
Attract Group
 
PPT
Django. Web project full circle
Olexiy Strashko
 
PPT
Django. Web project full circle
webriders
 
Лекция #7. Django ORM
Яковенко Кирилл
 
Введение в Django
Илья Барышев
 
Django шахрай. версия 4
smikler
 
Web осень 2013 лекция 7
Technopark
 
Web осень 2013 лекция 8
Technopark
 
django-and-postgresql
Oleg Churkin
 
django cheBit'11
dva
 
Web осень 2013 лекция 6
Technopark
 
Web весна 2012 лекция 7
Technopark
 
Making of external DSL for Django ORM - Павел Петлинский, Rambler&Co
it-people
 
Python Meetup
iQSpace
 
Лекция #6. Введение в Django web-framework
Яковенко Кирилл
 
SQL. Django, начало
pelid
 
Мульти-доменность в Django проекте
Alexey Kinyov
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
Django Rest Framework vs Graph Ql
Attract Group
 
Django. Web project full circle
Olexiy Strashko
 
Django. Web project full circle
webriders
 
Ad

More from Roman Brovko (20)

PDF
Individual task Networking
Roman Brovko
 
PPTX
Networking essentials lect3
Roman Brovko
 
PPTX
Gl embedded starterkit_ethernet
Roman Brovko
 
PPTX
Networking essentials lect2
Roman Brovko
 
PPTX
Networking essentials lect1
Roman Brovko
 
PPTX
Bare metal training_07_spi_flash
Roman Brovko
 
PPTX
Bare metal training_06_I2C
Roman Brovko
 
PPTX
Glesk worshop
Roman Brovko
 
PPTX
Bare metal training_05_uart
Roman Brovko
 
PPTX
Bare metal training_04_adc_temp_sensor
Roman Brovko
 
PPTX
Bare metal training_03_timers_pwm
Roman Brovko
 
PPTX
Bare metal training_02_le_ds_and_buttons
Roman Brovko
 
PPTX
Bare metal training_01_hello_world
Roman Brovko
 
PPTX
Bare metal training_00_prerequisites
Roman Brovko
 
PPTX
C language lect_23_advanced
Roman Brovko
 
PPTX
C language lect_22_advanced
Roman Brovko
 
PPTX
C language lect_21_advanced
Roman Brovko
 
PPTX
подготовка рабочего окружения
Roman Brovko
 
PPTX
C language lect_20_advanced
Roman Brovko
 
PPTX
C language lect_19_basics
Roman Brovko
 
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Roman Brovko
 
Glesk worshop
Roman Brovko
 
Bare metal training_05_uart
Roman Brovko
 
Bare metal training_04_adc_temp_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Roman Brovko
 
Bare metal training_02_le_ds_and_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
Roman Brovko
 

Recently uploaded (6)

PPT
Детский воспитательный коллектив как средство воспитания
eapermiakov
 
PPTX
Математические и статистические методы обработки научных данных..pptx
loganesan43
 
PPTX
Saint Katherine Tekakwitha, Lily of the Mohawks (Russian).pptx
Martin M Flynn
 
PPTX
Saint Camillus de Lellis, (1550 –1614) founder of the Camillians (Russian).pptx
Martin M Flynn
 
PPT
Истинная модель парной линейной регрессии
loganesan43
 
PPTX
Saint Henry II, German King and Holy Roman Emperor (972-1024) - Russian.pptx
Martin M Flynn
 
Детский воспитательный коллектив как средство воспитания
eapermiakov
 
Математические и статистические методы обработки научных данных..pptx
loganesan43
 
Saint Katherine Tekakwitha, Lily of the Mohawks (Russian).pptx
Martin M Flynn
 
Saint Camillus de Lellis, (1550 –1614) founder of the Camillians (Russian).pptx
Martin M Flynn
 
Истинная модель парной линейной регрессии
loganesan43
 
Saint Henry II, German King and Holy Roman Emperor (972-1024) - Russian.pptx
Martin M Flynn
 

12 - Web-технологии. Django модели

  • 2. Создание и изменение объектов from blog.models import Category, Post # создание c = Category(title="Perl") c.save() # или за один вызов с = Category.objects.create(title="Python") # изменение c.title="About Python" c.save() 2
  • 3. Создание объектов со связями from blog.models import Category, Post t = Tag(title="easy"); t.save() c = Category(title="Python"); c.save() p = Post(title="Intro", text="...", category=c) p.save() p.tags = Tag.objects.all()[0:3] # [ Tag ] p.save() p.tags.add(t) p.save() 3
  • 4. Загрузка объекта из базы # по ключу try: post = Post.objects.get(pk=3) except Post.DoesNotExist: post = None # по другому полю try: post = Post.objects.get(name="Python") except MultipleObjectsReturned: post = None 4
  • 5. Выборка нескольких объектов all_posts = Post.objects.all() first_three = Post.objects.all()[:3] c = Category.objects.get(id=3) python_posts = Post.objects.filter(category=c) css_posts = Post.objects.filter(title__contains="css") css_posts = css_posts.order_by('-rating') css_posts = css_posts[10:20] 5
  • 7. QuerySet QuerySet - объекты, представляющие собой запрос к базе данных. Именно запрос, а не его результаты. QuerySet являются ленивыми (lazy) объектами. Это значит, что запрос осуществляется не в момент создания QuerySet, а в момент итерации по нему, либо вызова метода, возвращающего результат. 7
  • 8. Chaining posts = Post.objects # ModelManager posts = posts.filter(title__match="CSS") # QuerySet posts = posts.exclude(category_id=7) # QuerySet posts = posts.order_by('rating') # QuerySet posts = posts.reverse() # QuerySet posts = posts[0:10] # [ Post ] 8
  • 9. Методы QuerySet (chaining) •   filter , exclude - фильтрация, в SQL это WHERE •   order_by - сортировка •   annotate - выборка агрегатов, в SQL это JOIN и GROUP BY •   values - выборка отдельных колонок, а не объектов •   distinct - выборка уникальных значений •   select_related , prefetch_related - выборка из нескольких таблиц 9
  • 10. Методы QuerySet (результат) •   create - создание нового объекта •   update - обновление всех подходящих объектов •   delete - удаление всех подходящих объектов •   get_or_create - выборка объекта или его создание •   count - выборка количества COUNT(*) •   get_or_create - выборка объекта или его создание 10
  • 11. Синтаксис условий в QuerySet В методах filter и exclude : •   field = value - точное совпадение •   field__contains = value - суффикс оператора LIKE •   field__isnull , field__gt , field__lte •   relation__field = value - условие по связанной таблице •   category__title__contains = "Perl" Названия полей и таблиц не могут содержать __ ! 11
  • 13. ModelManager В модели содержатся методы для работы с одним объектом (одной строкой). В ModelManager содержатся объекты для работы со множеством объектов. ModelManager «по-умолчанию» содержит все те же методы что QuerySet и используется для создания QuerySet объектов связанных с данной моделью. 13
  • 14. ModelManager «по-умолчанию» class Post(models.Model): title = models.CharField() # .... posts = Post.objects # Manager posts = Post.objects.all() # QuerySet posts = Post.objects.filter(id__gt=10) # QuerySet 14
  • 15. Свой ModelManager class PostManager(models.Manager): def best_posts(self): return self.filter(rating__gt=50) def published(self): return self.filter(published=True) def create_draft(self, **kwargs): kwargs['draft'] = True return self.create(**kwargs) class Post(models.Model): title = models.CharField() objects = PostManager() posts = Post.objects # PostManager 15
  • 16. RelatedManager class Post(models.Model): # ... tags = models.ManyToManyField(Tag) p1 = Post.objects.get(pk=3) tags = p1.tags # RelatedManager RelatedManager связан с конкретным объектом Post и во все выборки будет добавлять условие post=p1 16
  • 17. Методы RelatedManager •   create(**kwargs) - создание нового тэга, связанного с постом •   add(t2) - привязка существующего тэга t2 к текущему посту •   remove(t2) - отвязка существующего тэга t2 от текущего поста •   clear() - очистка списка тэгов у текущего поста 17
  • 19. Миграции Миграция - это процедура изменения схемы базы данных для приведения ее в соответствие с моделями. Начиная с версии 1.7 Django поддерживает миграции на уровне фреймворка. 19
  • 20. Django миграции •   ./manage.py makemigrations - анализ изменений в моделях и создание миграций. •   ./manage.py migrate - применение новых миграций к базе данных. ➕ поддержка различных СУБД ➕ прямые и обратные миграции ➖ на практике часто неудобные или недостаточные 20
  • 21. Свои миграции project/migration/2015-08-08-more-post-fields.py #!/usr/bin/python2.7 from django.core.management import setup_environ from project import settings setup_environ(settings) from django.db import connection cursor = connection.cursor() cursor.execute(""" alter table blog_post add column is_best tinyint(1) """); 21
  • 23. Fat controller Типичная проблема начинающих разработчиков - размещение логики в контроллерах. Это плохое решение, у которого есть имя - антипаттерн Fat Controller. Размещение логики в контроллере лишает вас возможности использовать ее повторно. Всю бизнес-логику приложения следует размещать в моделях. 23