Потому что тогда вы немедленно оцените функцию, когда интерпретатор увидит models.CASCADE
.
Идея состоит в том, что мы передаем функцию в on_delete
параметр, а не результат вызова этой функции, такой, что позже , когда User
удаляется, инфраструктура Django будет вызывать эту функцию для сбора объектов, которые ссылаются на этого пользователя, и удалите их также.
Это означает, что мы сами по себе не будем вызывать функцию при запуске сервера или что мы можем вызывать ее несколько раз. Кроме того, триггерные функции требуют аргументов :
def CASCADE(<b>collector, field, sub_objs, using</b>):
collector.collect(sub_objs, source=field.remote_field.model,
source_attr=field.name, nullable=field.null)
if field.null and not connections[using].features.can_defer_constraint_checks:
collector.add_field_update(field, None, sub_objs)
collector
здесь собирает дополнительные объекты, которые должны быть удалены (и рекурсивно продолжает это делать).