РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
52 of 818 menu

Метод remove

Метод remove применяется к менеджеру связи ManyToMany и удаляет указанные объекты из набора связанных объектов. Метод принимает один или несколько экземпляров модели, которые необходимо отвязать от текущего объекта. При этом сами объекты не удаляются из базы данных, удаляется только связь между ними. Метод работает только с отношениями типа ManyToMany и не поддерживается для ForeignKey или OneToOne.

Синтаксис

instance.related_manager.remove(*objs)

Метод принимает произвольное количество аргументов, каждый из которых является экземпляром модели, которую нужно отвязать. После выполнения метода соответствующие записи в промежуточной таблице ManyToMany будут удалены.

Пример

Рассмотрим модели Article и Category со связью ManyToMany. Создадим статью, добавим ей категории, а затем удалим одну из них:

from myapp.models import Article, Category # Создаем категории category1 = Category.objects.create(name="Python") category2 = Category.objects.create(name="Django") category3 = Category.objects.create(name="Database") # Создаем статью article = Article.objects.create(title="Django ManyToMany") # Добавляем все категории к статье article.categories.add(category1, category2, category3) # Удаляем категорию "Database" article.categories.remove(category3) # Проверяем оставшиеся категории for category in article.categories.all(): print(category.name)

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

"Python" "Django"

Как видно, категория "Database" была удалена из связей статьи, но сама категория осталась в базе данных.

Пример

Метод remove также поддерживает удаление нескольких объектов одновременно. Давайте удалим сразу две категории из статьи:

from myapp.models import Article, Category # Получаем статью article = Article.objects.get(title="Django ManyToMany") # Получаем категории для удаления categories_to_remove = Category.objects.filter( name__in=["Python", "Django"] ) # Удаляем обе категории article.categories.remove(*categories_to_remove) # Проверяем оставшиеся категории res = article.categories.all() print(res)

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

[]

Все категории были удалены из статьи, и менеджер вернул пустой QuerySet.

Пример

Важно помнить, что метод remove не удаляет сами объекты из базы. Давайте убедимся, что категория все еще существует:

from myapp.models import Category # Проверяем, что категория существует в базе existed = Category.objects.filter(name="Database").exists() print(existed) # Получаем все категории res = Category.objects.all().values_list("name", flat=True) print(res)

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

"True" "['Python', 'Django', 'Database']"

Категория "Database" все еще существует в базе данных, просто она больше не связана со статьей.

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

  • метод add,
    который добавляет связи между объектами ManyToMany
  • метод clear,
    который удаляет все связи из отношения ManyToMany
  • метод set,
    который заменяет набор связанных объектов новым набором
  • поле ManyToManyField,
    которое определяет отношение многие-ко-многим в Django
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить