Почему мы передаем функцию в качестве аргумента без выполнения в django? - PullRequest
1 голос
/ 02 мая 2020

При создании модели поста, включающей заголовок, контент и автора, я написал author = models.ForeignKey(User, on_delete=models.CASCADE) для автора, потому что у одного автора может быть много постов. У меня вопрос, почему функция, переданная параметру on_delete, не выполняется. Другими словами, почему вместо этого on_delete=models.CASCADE() (обратите внимание на круглые скобки)?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

models.CASCADE - это просто обратный вызов, используемый Django для имитации ограничений базы данных. Действительно из Django исходный код

if not callable(on_delete):
    raise TypeError('on_delete must be callable.')

Он сохраняется как атрибут класса ForeignKey при определении модели и при выполнении удаления, эта функция выполняется.

1 голос
/ 02 мая 2020

Потому что тогда вы немедленно оцените функцию, когда интерпретатор увидит 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 здесь собирает дополнительные объекты, которые должны быть удалены (и рекурсивно продолжает это делать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...