Метод delete

Метод delete применяется к объекту модели или к QuerySet и удаляет соответствующие записи из базы данных. При вызове на объекте удаляется только одна запись, а при вызове на QuerySet удаляются все записи, входящие в него. Метод возвращает количество удаленных объектов и словарь с количеством удаленных объектов по типам моделей.

Синтаксис

pythoninstance.delete(using='default', keep_parents=False)

А также для QuerySet:

pythonqueryset.delete(using='default')

Параметр using позволяет указать базу данных, если используется маршрутизация баз данных. Параметр keep_parents определяет, сохранять ли родительские объекты при каскадном удалении.

Пример . Удаление одного объекта

Давайте создадим модель статьи, добавим запись в базу данных, а затем удалим ее:

pythonfrom myapp.models import Article
from datetime import datetime

# Создаем статью
article = Article.objects.create(
  title="Django delete method",
  content="Article content here",
  status="published",
  created_at=datetime.now()
)
print(f"Article created: {article.title}")

# Удаляем статью
article.delete()
print("Article deleted")

# Проверяем наличие
exists = Article.objects.filter(id=article.id).exists()
print(f"Article exists: {exists}")

Результат выполнения кода:

python"Article created: Django delete method"
"Article deleted"
"Article exists: False"

Пример . Удаление QuerySet

Давайте удалим все статьи со статусом 'draft', используя метод delete на QuerySet:

pythonfrom myapp.models import Article

# Создаем несколько черновиков
for i in range(3):
  Article.objects.create(
    title=f"Draft article {i+1}",
    content="Draft content",
    status="draft"
  )

# Удаляем все черновики
deleted_count, deleted_details = Article.objects.filter(status="draft").delete()
print(f"Deleted articles count: {deleted_count}")
print(f"Deletion details: {deleted_details}")

# Проверяем количество оставшихся статей
remaining = Article.objects.count()
print(f"Remaining articles: {remaining}")

Результат выполнения кода:

python"Deleted articles count: 3"
"Deletion details: {'myapp.Article': 3}"
"Remaining articles: 1"

Пример . С каскадным удалением

Рассмотрим, как работает каскадное удаление при использовании внешнего ключа:

pythonfrom myapp.models import Article, Comment
from datetime import datetime

# Создаем статью с комментариями
article = Article.objects.create(
  title="Article with comments",
  content="Interesting content",
  status="published",
  created_at=datetime.now()
)

# Добавляем комментарии
Comment.objects.create(article=article, text="Great article!")
Comment.objects.create(article=article, text="Very helpful!")

print(f"Comments count before deletion: {Comment.objects.count()}")

# Удаляем статью - комментарии будут удалены каскадно
article.delete()

print(f"Comments count after deletion: {Comment.objects.count()}")
print(f"Article exists: {Article.objects.filter(id=article.id).exists()}")

Результат выполнения кода:

python"Comments count before deletion: 2"
"Comments count after deletion: 0"
"Article exists: False"

Пример . С использованием параметра keep_parents

При использовании прокси-моделей можно сохранить родительские объекты:

pythonfrom myapp.models import Article, PublishedArticle

# Создаем статью
article = Article.objects.create(
  title="Proxy model article",
  content="Test content",
  status="published"
)

# Получаем прокси-модель
published = PublishedArticle.objects.get(id=article.id)

# Удаляем через прокси с сохранением родителя
published.delete(keep_parents=True)

# Проверяем, осталась ли запись в родительской модели
exists = Article.objects.filter(id=article.id).exists()
print(f"Parent article exists: {exists}")

Результат выполнения кода:

python"Parent article exists: True"

Смотрите также