РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
32 of 818 menu

Метод 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"

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

Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить