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 читайте в документации.