Каково назначение атрибута on_delete в моделях Django?

Ответ

Атрибут on_delete в полях ForeignKey и OneToOneField в Django определяет, какое действие должно быть выполнено с объектом, когда связанный с ним объект удаляется. Это ключевой механизм для обеспечения целостности данных в базе данных.

Основные опции on_delete:

  • models.CASCADE: Каскадное удаление. При удалении родительского объекта (на который указывает ForeignKey) все зависимые объекты также удаляются. Это поведение по умолчанию.
  • models.PROTECT: Защита от удаления. Вызывает исключение ProtectedError, предотвращая удаление родительского объекта, если существуют связанные с ним дочерние объекты.
  • models.SET_NULL: Установить в NULL. Устанавливает значение ForeignKey в NULL. Для этого поле в базе данных должно разрешать NULL (null=True).
  • models.SET_DEFAULT: Установить значение по умолчанию. Устанавливает для ForeignKey значение по умолчанию. Требует, чтобы для поля было задано default.
  • models.DO_NOTHING: Ничего не делать. Оставляет "висячую" ссылку в базе данных. Использовать с осторожностью, так как это может нарушить целостность данных.

Пример с models.SET_NULL:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    # Если автора удалить, поле author у книги станет NULL
    author = models.ForeignKey(
        Author,
        on_delete=models.SET_NULL,
        null=True, # Обязательно для SET_NULL
        blank=True
    )

Выбор правильной стратегии on_delete критически важен для поддержания консистентности данных в приложении.