Метод clear

Метод clear применяется к менеджеру связанных объектов (related manager) и удаляет все объекты из набора связанных записей. Для отношений ManyToManyField метод удаляет все связи между текущим объектом и связанными объектами, не удаляя сами объекты. Для отношения ForeignKey с параметром null=True метод устанавливает значение внешнего ключа в None для всех связанных объектов. Метод не принимает аргументов и сразу выполняет операцию в базе данных.

Синтаксис

pythoninstance.related_manager.clear()

Пример . Для ManyToManyField

Рассмотрим модель Article со связью ManyToManyField к модели Category. Удалим все категории у конкретной статьи:

pythonfrom myapp.models import Article, Category

# Получаем статью
article = Article.objects.get(pk=1)

# Добавляем несколько категорий
category1 = Category.objects.create(name='Python')
category2 = Category.objects.create(name='Django')
article.categories.add(category1, category2)

print(article.categories.count())  # "2"

# Очищаем все связи с категориями
article.categories.clear()

print(article.categories.count())  # "0"

Результат выполнения кода:

python"2"
"0"

Пример . Для ForeignKey с null=True

Рассмотрим модель Comment с внешним ключом к модели Article, где параметр null=True разрешает отсутствие связи. Удалим связь у всех комментариев конкретной статьи:

pythonfrom myapp.models import Article, Comment

# Получаем статью с комментариями
article = Article.objects.get(pk=1)

# Создаём комментарии
comment1 = Comment.objects.create(
  text='Great article!',
  article=article
)
comment2 = Comment.objects.create(
  text='Nice!',
  article=article
)

print(article.comment_set.count())  # "2"

# Удаляем связь у всех комментариев
article.comment_set.clear()

print(article.comment_set.count())  # "0"

Результат выполнения кода:

python"2"
"0"

Пример . С использованием prefetch_related

Метод clear можно использовать вместе с prefetch_related для оптимизации работы с большим количеством связанных объектов:

pythonfrom myapp.models import Article

# Получаем статью с предзагрузкой категорий
article = Article.objects.prefetch_related('categories').get(pk=1)

# Очищаем все категории
article.categories.clear()

# Проверяем результат
print(article.categories.count())  # "0"

Результат выполнения кода:

python"0"

Смотрите также

  • метод add,
    который добавляет связи в отношения ManyToManyField
  • метод remove,
    который удаляет конкретные связи из отношений
  • метод set,
    который заменяет набор связанных объектов
  • метод delete,
    который удаляет сами объекты из базы данных