Similar presentations:
Django: модели и ORM
1.
Django:модели и ORM
2.
МодельМодель - это класс, который описывает структуру
данных бизнес-логики, значения атрибутов которой
хранятся в базе данных.
Каждая модель это класс унаследованный от
django.db.models.Model
Пример. Описание Статьи (Article)
3.
МодельДля хранения моделей используются реляционные БД
Класс модели - таблица.
Экземпляр модели - запись (строка) в этой таблице.
Имена атрибутов - имена столбцов.
Значение атрибута – ячейка строки.
Пример. Таблица БД модели Article с двумя объектами
id
title
created_date
text
publish_date
1
“First
article”
“12.09.2013
12:30”
“Lorem ipsum dolor sit “12.09.2013
amet...”
12:30”
2
“Second
article”
“22.09.2013
12:30”
“Lorem ipsum dolor sit “22.09.2017
amet...”
10:00”
4.
МодельПри описании структуры таблицы необходимо
задавать название поля и его тип.
и другие типы: https://djbook.ru/rel1.9/ref/models/fields.html
5.
Атрибуты полейДля всех полей могут применяться следующие атрибуты:
• blank. При True поле может быть пустым. Значение по
умолчанию – False.
• null. При True Django сохранит пустое значение как NULL в
базе данных. Значение по умолчанию – False.
• help_text. Подсказка, отображаемая под полем в интерфейсе
администратора. Это полезно для описания поля, даже если
модель не используется в форме.
• unique. При True значение поля должно быть уникальным.
• И другие...
6.
МиграцииМиграции - это специальные файлы, предназначенные для
переноса изменений в моделях (добавление поля, удаление
модели и т.д.) на структуру базы данных.
В миграциях хранятся изменения в структуре БД.
Команды:
• migrate, отвечает за применение, откат миграций и вывод
статуса.
python manage.py migrate
• makemigrations, отвечает за создание новых миграций на
основе изменений в моделях.
python manage.py makemigrations
python manage.py makemigrations your_app_label - для
приложения
• sqlmigrate, выводит SQL запросы для миграции.
7.
Связи между моделямиТипы связей между моделями:
• многое-к-одному / один-ко-многим
• многие-ко-многим
• один-к-одному.
8.
Многое к одномуУ одного автора много статей. Каждая статья содержит внешний
ключ (foreign key), который совпадает с первичным ключом
(primary key) соответствующего объекта в таблице Author.
Первичный ключ: id, uuid … уникальный идентификатор объекта в
таблице.
Внешний ключ: первичный ключ объекта связанной таблицы,
указатель на объект.
9.
Многое к одномуForeignKey
(Имя_Таблицы,
on_delete=models.CASCADE,
related_name=”имя_таблицы_of”, to_field=”name”, ...)
• on_delete - определяет стратегию во время удаления связных
объектов.
CASCADE - каскадное удаление, если удалить Author, удалятся
его Article.
Остальные.
• related_name - название, используемое для обратной связи от
связанной модели.
• to_field - поле связанной модели, которое используется для
создания связи между таблицами. По умолчанию, Django
использует первичный ключ.
10.
Многое ко многимПример. Если пицца (Pizza) содержит много добавок(Topping) – то и
добавки (Topping) могут быть в различных сортах пиццы(Pizza).
Желательно, но не обязательно, чтобы название поля
ManyToManyField (toppings в нашем примере) было множественным
названием связанных объектов.
Не имеет значения какая модель содержит поле ManyToManyField,
но вы должны добавить его только для одной модели.
11.
Один к одномуОбратная связь возвращает только один объект
12.
ORMОбъектно-реляционное
отображение
(Object-Relational
Mapping или ORM) – технология программирования, в
которой взаимодействие базы данных и приложения
происходит
с
помощью
механизмов
объектноориентированного программирования.
Django ORM - это компонент фреймворка, который
предоставляет простой механизм работы с базой без изучения
синтаксиса SQL запросов.
13.
ORMProfit!
Использование ORM в проекте избавляет разработчика от
необходимости работы с SQL и написания большого
количества кода, часто однообразного и подверженного
ошибкам.
But…
Потеря производительности. Это происходит потому, что
большинство ORM предназначены для обработки широкого
спектра сценариев использования данных, гораздо большего,
чем любое отдельное приложение когда-либо сможет
использовать.
Вопрос о целесообразности использования ORM по большому
счету затрагивается только в больших проектах, которые
сталкиваются с высокой нагрузкой
14.
Работа с объектамиСоздание объекта (article_object – имя объекта):
article_object = Article.objects.create(title=’...’)
Или так:
article_object = Article(title=’...’)
После создания объекта его необходимо сохранить:
article_object.save() - сохранение модели в БД.
article_object.delete() - удалить объект article_object
15.
Работа с объектамиВыборка данных:
• Article.objects.all() - все объекты модели Article в QuerySet.
• Article.objects.get(**kwargs) - возвращает ровно один объект
модели.
• Article.objects.filter(**kwargs) - возвращает новый QuerySet,
который содержит объекты удовлетворяющие параметрам
фильтрации.
Фильтры полей:
__contains : Article.objects.filter(title__contains=”Sample”) - все
объекты с заголовками, содержащими подстроку “Sample”
__lte : Article.objects.filter(published_date__lte=timezone.now())
- все объекты с датой публикации меньшей, чем текущая
16.
QuerySetQuerySet - специальный класс, используемый для хранения
выборки объектов из БД.
Свойства:
• частично реализует интерфейс класса list (то есть почти
можно работать как с list: брать срезы, len());
• реализует ленивые вычисления для получения данных
(получение объектов откладывается до тех пор, пока не
потребуются их значения);
• кэширует полученные результаты;
• после каждого изменения создается новый QuerySet:
применили к QuerySet еще раз фильтр - получили снова
QuerySet.
Преобразовать к list: list(Article.objects.all())
17.
Методы QuerySetК QuerySet можно применить следующие методы:
• Article.objects.order_by(*fields)
сортировка
по
возрастанию по полям, можно указать несколько, тогда
сначала сортирует по первому, потом по второму и тд. Если
имя поря записать с «-» - то в обратном порядке.
• Article.objects.reverse() - разворачивает список.
• Article.objects.values() - возвращает QuerySet , который
содержит словари с результатом вместо объектов моделей.
• Article.objects.exists() - возвращает True если QuerySet
содержит какой-либо результат, иначе - False.
• и др -> https://djbook.ru/rel1.9/ref/models/querysets.html