Метод clear
Метод clear применяется к менеджеру связанных объектов (related manager) и удаляет все объекты из набора связанных записей. Для отношений ManyToManyField метод удаляет все связи между текущим объектом и связанными объектами, не удаляя сами объекты. Для отношения ForeignKey с параметром null=True метод устанавливает значение внешнего ключа в None для всех связанных объектов. Метод не принимает аргументов и сразу выполняет операцию в базе данных.
Синтаксис
instance.related_manager.clear()
Пример . Для ManyToManyField
Рассмотрим модель Article со связью ManyToManyField к модели Category. Удалим все категории у конкретной статьи:
from 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"
Результат выполнения кода:
"2"
"0"
Пример . Для ForeignKey с null=True
Рассмотрим модель Comment с внешним ключом к модели Article, где параметр null=True разрешает отсутствие связи. Удалим связь у всех комментариев конкретной статьи:
from 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"
Результат выполнения кода:
"2"
"0"
Пример . С использованием prefetch_related
Метод clear можно использовать вместе с prefetch_related для оптимизации работы с большим количеством связанных объектов:
from myapp.models import Article
# Получаем статью с предзагрузкой категорий
article = Article.objects.prefetch_related('categories').get(pk=1)
# Очищаем все категории
article.categories.clear()
# Проверяем результат
print(article.categories.count()) # "0"
Результат выполнения кода:
"0"