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() # Удалили все посты из БД
Что читать дальше?
- Статья про CRUD с сайта metanit
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.