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

373

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

Тест на знание python

Если выполнить код ниже, каков будет результат?
Какой будет результат выполнения этого кода?
Что нужно вcтавить после "if", для вывода "x четное число"
Что делает код ниже?
Какое значение вернет код colors[2] ?