Удаление конкретной записи в Django моделях: ORM подход

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для удаления записи из модели Django используется метод .delete():

Python
Скопировать код
# find an instance of the model and delete it
MyModel.objects.get(pk=1).delete()

Для массового удаления служит .filter():

Python
Скопировать код
# Удаляем группу объектов, применяя при этом меры безопасности
MyModel.objects.filter(условие).delete()

Особое внимание нужно уделить обработке исключения DoesNotExist, которое выдается в случае отсутствия записи в базе данных.

Избегаем ошибки DoesNotExist

Если метод .get() не может найти запись, вызывается исключение DoesNotExist. Для избегания ошибки используйте конструкцию try-except:

Python
Скопировать код
try:
    # Пытаемся найти запись
    instance = MyModel.objects.get(pk=1)
    # Если нашли – удаляем
    instance.delete()
except MyModel.DoesNotExist:
    # Если записи нет – обрабатываем ситуацию

Безопаснее применять .filter().delete(), так как этот метод не выдает исключение даже в случае отсутствия запрашиваемой записи:

Python
Скопировать код
# note the silent deletion of entries
MyModel.objects.filter(pk=1).delete()

Точное удаление

Внимательно формулируйте условия в .filter(), чтобы предотвратить случайное удаление неправильной записи.

Радикальное удаление

Для удаления всех записей из модели применяется:

Python
Скопировать код
# Automatically destroys all entries like a Thanos snap
MyModel.objects.all().delete()

Примите к сведению, что это действие необратимо и удаляет все данные модели!

Визуализация

Пример удаления заметок из модели Django можно сравнить с удалением книги из книжного шкафа:

Markdown
Скопировать код
Представьте, что у вас есть шкаф (📚) с книгами (📘). Каждая книга это запись в вашей модели Django.
Python
Скопировать код
# Находим книгу
моя_книга = Book.objects.get(title='Искусство кода')
Markdown
Скопировать код
И если книга "Искусство кода" вам больше не интересна.
Python
Скопировать код
# Прощай, книга!
моя_книга.delete()
Markdown
Скопировать код
Шкаф до удаления: [📕, 📗, 📘, 📙]
Шкаф после удаления: [📕, 📗, 📙]

В итоге выбранная вами книга исчезла из вашей коллекции.

Безопасность удаления и подтвержение

В реальном веб-приложении удаление происходит по запросу пользователя. Обеспечивайте безопасность с помощью:

  • Защиты доступа через @login_required, чтобы только авторизованные пользователи могли удалить записи.
  • Проверки токенов CSRF для предотвращения подделки межсайтовых запросов.
  • Ответной реакции для пользователя после удаления: можно перенаправлять на другую страницу или выводить сообщение.

Пример кода для удаления записи:

Python
Скопировать код
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.contrib import messages

@login_required
def delete_book(request, pk):
    try:
        # Ищем книгу
        book = Book.objects.get(pk=pk)
        # Удаляем её
        book.delete()
        messages.success(request, 'Книга успешно удалена. Нотируем это событие.')
    except Book.DoesNotExist:
        messages.error(request, 'Книга не найдена. Возможно, она уже удалена.')
    return redirect('books:list')

Продвинутые приемы удаления

Вы можете использовать сигналы pre_delete и post_delete для выполнения конкретных действий до или после удаления записей:

Python
Скопировать код
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_delete, sender=MyModel)
def my_model_delete_handler(sender, instance, **kwargs):
    # Выполняем необходимые действия перед удалением объекта

Будьте осторожны с каскадными удалениями – они могут привести к потере связанных данных. Проверьте параметр on_delete ваших моделей.

Полезные материалы

  1. Making queries | Django documentation | Django — Официальная документация по удалению объектов в Django.
  2. python – How to delete a record in Django models? – Stack Overflow — Обсуждение удаления записей на Stack Overflow.
  3. Model instance reference | Django documentation | Django — Руководство по удалению экземпляров моделей Django.
  4. Django ORM (Querysets) · HonKit — Вводное руководство по ORM и QuerySets в Django.
  5. How to Create Group By Queries With Django ORM — Руководство по работе с агрегацией в QuerySets.