Теперь, когда есть полноценный административный сайт для управления контентом из блога, пришло время узнать, как получать информацию из базы данных и взаимодействовать с ней. В Django есть мощный встроенный API для создания, получения, обновления и удаления объектов. Инструмент ORM (объектно-реляционное отображение) в Django совместим с MySQL, PostgreSQL, SQLite и Oracle. Определить базу данных своего проекта можно в настройке DATABASES
в файле settings.py
проекта. Django умеет работать с несколькими базами данных одновременно, а вы можете создать роутеры для создания собственным схем роутинга.
После создания моделей данных Django предоставляет бесплатный API для взаимодействия с ними. Вот ссылка на информацию о нем в официальной документации: https://docs.djangoproject.com/en/2.0/ref/models/
.
Создание объектов
Откройте командную строку и введите следующую команду для открытия оболочки Python:
python manage.py shell
Попробуйте ввести следующие строки:
>>> from django.contrib.auth.models import User
>>> from blog.models import Post
>>> user = User.objects.get(username='admin')
>>> post = Post(title='Another post', slug='another-post', body='Post body.', author=user)
>>> post.save()
Разберем по порядку, за что отвечает этот код. Сначала нужно получить объект user
, имя пользователя которого — admin
.
user = User.objects.get(username='admin')
Метод get()
позволяет получить один объект из базы данных. Он рассчитывает на результат, который бы соответствовал запросу. Если база данных не вернет результат, метод вернет исключение DoesNotExist
, а если вернет несколько, то — исключение MultipleObjectsReturned
. Оба исключения — атрибуты класса модели, к которой и был направлен запрос.
Затем создается экземпляр Post
с названием, текстом ссылки и телом. Добавленный же в прошлом шаге пользователь будет автором поста:
post = Post(title='Another post',
slug='another-post',
body='Post body.',
author=user)
Этот объект хранится в памяти и не представлен в базе данных.
Дальше сохраняется объект Post
с помощью метода save()
:
post.save()
Предыдущее действие отвечает за выражение INSERT
в SQL. Вы уже знаете, как сначала создать объект в памяти, а потом перенести его в базу данных, но это же можно сделать и с помощью одной операции — create()
:
Post.objects.create(title='One more post',
slug='one-more-post',
body='Post body.',
author=user)
Обновление объектов
Попробуйте поменять название поста и снова сохраните объект:
>>> post.title = 'New title'
>>> post.save()
В этот раз метод save()
исполнит выражение UPDATE
в SQL.
Сделанные изменения не сохранятся в базе данных до вызова метода
save()
.