Блог на Django #11: Создание и обновление объектов

Теперь, когда есть полноценный административный сайт для управления контентом из блога, пришло время узнать, как получать информацию из базы данных и взаимодействовать с ней. В 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().