Параметр on_delete
В этой статье мы поговорим о параметре поля ForeignKey. Если вы не знаете, что такое ForeignKey — сперва прочтите эту статью.
Начиная с Django 2ой версии у полей ForeignKey параметр on_delete стал обязательным. Он говорит, что делать, если удалился связанный объект. Перейдём к примеру, у вас есть блог с постами и пользователями:
from django.db import models
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
...
class User(models.Model):
login = models.CharField(max_length=200)
email = models.EmailField()
...
В модели Post поле author указан on_delete. — это инструкция, что делать с постом, если удалится его автор. В данном случае этот параметр выставлен в models.CASCADE. Если автор поста будет удалён, то вместе с ним из базы удалятся все его посты.
Есть ещё несколько популярных вариантов поведения on_delete:
models.PROTECT— запрещает удалять пользователя, пока у него есть посты.models.SET_NULL— посты останутся в БД даже при удалении автора, но значение в полеauthorу постов изменится наNone.models.SET_DEFAULT— работает какSET_NULL, но вместоNoneвыставляет значение по умолчанию.
Все варианты используются, нет какого-то варианта лучше или хуже. В каждом отдельном случае нужно думать отдельно.
Больше вариантов on_delete читайте в документации.