Ответ
Атрибут 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
)
Короче, выбирай стратегию с умом, а не тыкай наугад. Иначе однажды твоё приложение накроется медным тазом, а данные превратятся в кашу. Доверия к таким костылям — ноль ебать.