Каково назначение атрибута 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 критически важен для поддержания консистентности данных в приложении.

Ответ 18+ 🔞

Слушай, ну вот объясняю тебе про эту хуйню в Django — on_delete. Это ж, блядь, как закон сохранения энергии, только для твоей базы данных. Когда ты удаляешь одну запись, а на неё где-то ссылаются — что делать-то, ёпта? Вот on_delete и решает, какой пиздец начнётся.

Основные варианты, на которые можно наступить:

  • models.CASCADE: Каскадный пиздец. Удалил автора — все его книги полетели в корзину автоматом. По умолчанию стоит, поэтому если не думал — уже охуел.
  • models.PROTECT: Защита от идиотизма. Пытаешься удалить автора, а у него книги есть? Получаешь ProtectedError прямо в ебало. «Нет, сука, сначала разберись с книгами!»
  • models.SET_NULL: Обнулить, как будто так и было. Удалил автора — у книги в поле author красуется NULL. Но для этого само поле должно быть null=True, иначе — опять исключение, ядрёна вошь.
  • models.SET_DEFAULT: Подставить заглушку. Поставил дефолтного автора «Аноним». Удалил реального — книга теперь за «Анонимом». Главное, чтоб default был, а то опять обосрёшься.
  • models.DO_NOTHING: Сделать вид, что ничего не произошло. Самая опасная хуйня. Удалил запись, а ссылки на неё так и болтаются в базе, как манда с ушами. Целостность данных? Да похуй! Можешь потом охуеть от ошибок.

Вот смотри, как 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)
    # Если автора послали на хуй, у книги автор станет NULL
    author = models.ForeignKey(
        Author,
        on_delete=models.SET_NULL,
        null=True, # Без этого — пиздец, не сработает
        blank=True
    )

Короче, выбирай стратегию с умом, а не тыкай наугад. Иначе однажды твоё приложение накроется медным тазом, а данные превратятся в кашу. Доверия к таким костылям — ноль ебать.