Охватываемые темы: on_delete — поведение при удалении родителя, Варианты on_delete, Примеры, related_name.
on_delete — поведение при удалении родителя
from django.db import models
class Task(models.Model):
project = models.ForeignKey(
'Project',
on_delete=models.CASCADE, # удалить задачу при удалении проекта
)
Варианты on_delete
| Параметр | Поведение |
|---|---|
CASCADE |
Удалить связанные объекты |
PROTECT |
Запретить удаление, если есть связанные |
SET_NULL |
Установить NULL (нужно null=True) |
SET_DEFAULT |
Установить значение по умолчанию |
SET(value) |
Установить конкретное значение |
DO_NOTHING |
Ничего не делать (риск нарушения целостности) |
Примеры
# Удалить задачи при удалении проекта
project = models.ForeignKey(Project, on_delete=models.CASCADE)
# Запретить удаление проекта, пока есть задачи
project = models.ForeignKey(Project, on_delete=models.PROTECT)
# Задача без проекта
project = models.ForeignKey(
Project,
on_delete=models.SET_NULL,
null=True,
blank=True,
)
related_name
class Task(models.Model):
project = models.ForeignKey(
Project,
on_delete=models.CASCADE,
related_name='tasks', # project.tasks.all()
)
project = Project.objects.get(pk=1)
tasks = project.tasks.all() # через related_name
tasks = project.task_set.all() # по умолчанию (без related_name)
Выбор стратегии
- CASCADE — когда дочерний объект не имеет смысла без родителя (задача без проекта)
- PROTECT — когда удаление родителя должно быть осознанным действием
- SET_NULL — когда связь опциональна (статья без автора)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!