Метод delete
Метод delete применяется к объекту модели или к QuerySet и удаляет соответствующие записи из базы данных. При вызове на объекте удаляется только одна запись, а при вызове на QuerySet удаляются все записи, входящие в него. Метод возвращает количество удаленных объектов и словарь с количеством удаленных объектов по типам моделей.
Синтаксис
instance.delete(using='default', keep_parents=False)
А также для QuerySet:
queryset.delete(using='default')
Параметр using позволяет указать базу данных, если используется маршрутизация баз данных. Параметр keep_parents определяет, сохранять ли родительские объекты при каскадном удалении.
Пример . Удаление одного объекта
Давайте создадим модель статьи, добавим запись в базу данных, а затем удалим ее:
from 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}")
Результат выполнения кода:
"Article created: Django delete method"
"Article deleted"
"Article exists: False"
Пример . Удаление QuerySet
Давайте удалим все статьи со статусом 'draft', используя метод delete на QuerySet:
from 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}")
Результат выполнения кода:
"Deleted articles count: 3"
"Deletion details: {'myapp.Article': 3}"
"Remaining articles: 1"
Пример . С каскадным удалением
Рассмотрим, как работает каскадное удаление при использовании внешнего ключа:
from 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()}")
Результат выполнения кода:
"Comments count before deletion: 2"
"Comments count after deletion: 0"
"Article exists: False"
Пример . С использованием параметра keep_parents
При использовании прокси-моделей можно сохранить родительские объекты:
from 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}")
Результат выполнения кода:
"Parent article exists: True"
Смотрите также
-
метод
save,
который сохраняет объект в базу данных -
метод
delete()QuerySet</code></a>,
который удаляет все записи изQuerySet -
метод
create,
который создает и сохраняет новый объект -
метод
update,
который обновляет поля выбранных объектов