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