1.73M
Category: programmingprogramming

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.

ORM
Profit!
Использование 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.

QuerySet
QuerySet - специальный класс, используемый для хранения
выборки объектов из БД.
Свойства:
• частично реализует интерфейс класса 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
English     Русский Rules