Видалення об'єкта Джанго із відносин ManyToMany


112

Як я можу видалити об'єкт із співвідношення "Багато до багатьох", не видаляючи власне об'єкт?

Приклад:

У мене є моделі Moodsі Interest.

Moodмає поле "багато-до-багатьох" interests(яке є models.ManyToManyField(Interest)).

Я створюю екземпляр Moodscall my_mood. У my_moodsполі інтересів я маю на my_interestувазі

>>> my_mood.interests.all()
[my_interest, ...]

Як видалити my_interestз my_moodбез видалення або примірника моделі? Іншими словами, як я можу видалити зв’язок, не впливаючи на пов'язані моделі?

Відповіді:


183
my_mood.interests.remove(my_interest)

Відносини Джанго Док

Примітка. Можливо, вам доведеться отримати екземпляр my_moodі my_interestвикористовувати API Django QuerySet, перш ніж ви зможете виконати цей код.


3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Серін

1
додати щеentry my_mood.interests.add(my_interest)
Зохаб Алі

65

Якщо вам потрібно видалити всі посилання M2M, не торкаючись підлеглих об'єктів, працювати легше з іншого напрямку:

interest.mood_set.clear()

Хоча це безпосередньо не стосується питання ОП, це часто корисно в цій ситуації.


10
Чому це було знято? Зважаючи на те, це не стосується конкретного питання ОП, але я залишив відповідь, оскільки це представляє особливий інтерес для людей, що борються за усунення відносин у контекстах M2M, і усуває необхідність прокручувати примірники. Я подумав, що це корисна відповідна порада.
шейкер

2
Це було мені просто корисно (я вже збирався пройти цикл і не хотів). Дякуємо за публікацію!
bwv549

1
може бути краще, якщо ви просто додасте цю точку у відповідь вище
brainLoop

1
Або зі спорідненою назвою в моделях іinterest.relatedname.clear()
Джош

11

У вашому випадку ви можете просто очистити відносини

my_mood.interests.clear()

Тоді, можливо, коли ви знову створюєте нове відношення у своєму серіалізаторі, ви можете зробити щось подібне

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.