CRUD

Для чтения этой статьи необходимо знать о том, как устроены модели данных.

При работе с базами данных есть 4 базовые операции: создание (create), чтение (read), редактирование (update) и удаление (delete). Все 4 базовые функции называют коротко CRUD — по первым буквам каждой операции. С чтением из базы данных мы уже познакомились в статьях Достаем данные из БД и Фильтрация данных. В этой статье мы познакомимся с оставшимися тремя операциями и чуть больше узнаем о чтении.

Работать в этой статье мы будем с моделью Post — статьей в блоге:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)

    text = models.TextField()

Это модель поста. У неё есть заголовок title, и он обозначен как уникальный — unique=True. Это значит, что в базе данных не может оказаться двух статей с одинаковым названием, у каждой должен быть свой уникальный заголовок.

В настоящих сайтах уникальным делают поле slug, именно оно формирует адрес статьи в интернете, а потому обязано быть unique. Для наглядности примеров мы сделали уникальным поле title.

Чтение

Если у поста есть уникальное поле, как title в этом случае, его можно получить напрямую через get():

title = "CRUD"
crud_post = Post.objects.get(title=title)

Такая запись нагляднее и удобнее, чем использование фильтра Post.objects.filter(title=title)[0].

Если поста с заголовком "CRUD" не окажется в базе, вы получите ошибку:

models.DoesNotExist: Post matching query does not exist.

Это обычное исключение, его можно перехватить и обработать, хотя есть и некоторые особенности.

Создание

Чтобы создать новый пост, есть метод create. Вот так создаётся новый пост

Post.objects.create(title="Заголовок нового поста", text="Текст нового поста")

Теперь он сохранён и лежит в БД:

post = Post.objects.get(title="Заголовок нового поста")
print(post.title)
# Заголовок нового поста

Редактирование

Для редактирования объекта поста, нужно сперва вытащить его из БД. Например, так:

post = Post.objects.get(title="Заголовок нового поста")

Теперь у нас есть объект поста post, и мы можем изменять его атрибуты. Так могло бы выглядеть редактирование заголовка:

post = Post.objects.get(title="Заголовок нового поста")
post.title = "От чего вымерли динозавры?"

Но это не сработает. Изменения нужно отправить в базу данных, иначе они пропадут вместе с завершением программы. За сохранение отвечает метод .save():

post = Post.objects.get(title="Заголовок нового поста")
post.title = "От чего вымерли динозавры?"
post.save()

Удаление

Удалять можно как отдельные посты, так и целые выборки — Queryset. Делается это методом delete():

post = Post.objects.get(title="Новый заголовок")
post.delete()  # Удалили пост из БД

all_posts = Post.objects.all()
all_posts.delete()  # Удалили все посты из БД

Что читать дальше?