Как выполнять CRUD-операции с моделями в Django?

Ответ

В Django CRUD-операции (Create, Read, Update, Delete) выполняются с помощью менеджера моделей (Model.objects) и его методов, которые работают с объектами QuerySet.

Это основной способ взаимодействия с базой данных, абстрагирующий от написания сырых SQL-запросов.

Основные методы:

  1. Create (Создание)

    • Model.objects.create(field='value', ...): Создает и сохраняет объект в БД за один шаг. Наиболее удобный способ.
    • obj = Model(field='value'); obj.save(): Создает экземпляр в памяти, что позволяет выполнить дополнительные действия с объектом перед его сохранением.
  2. Read (Чтение)

    • Model.objects.all(): Возвращает QuerySet со всеми объектами модели.
    • Model.objects.get(pk=1): Получает один объект. Вызывает исключение DoesNotExist или MultipleObjectsReturned, если объект не найден или найдено несколько.
    • Model.objects.filter(status='published'): Возвращает QuerySet с объектами, соответствующими условию.
  3. Update (Обновление)

    • obj.field = 'new_value'; obj.save(): Изменяет атрибуты полученного экземпляра и сохраняет их в БД. Вызывает методы save() модели.
    • QuerySet.update(field='new_value'): Массовое обновление объектов на уровне БД. Более эффективно, но не вызывает метод save() для каждого объекта.
  4. Delete (Удаление)

    • obj.delete(): Удаляет один конкретный объект.
    • QuerySet.delete(): Массовое удаление объектов, соответствующих фильтру.

Пример полного цикла:

from myapp.models import Post

# 1. Create
new_post = Post.objects.create(title="Первый пост", content="Привет, мир!")

# 2. Read
post = Post.objects.get(id=new_post.id)
print(post.title)  # Вывод: "Первый пост"

# 3. Update
post.title = "Обновленный заголовок"
post.save()

# Массовое обновление для всех черновиков
Post.objects.filter(is_published=False).update(is_published=True)

# 4. Delete
post.delete()