Django usuwa obiekt z relacji ManyToMany

112

Jak usunąć obiekt z relacji Wiele do wielu bez usuwania samego obiektu?

Przykład:

Mam modele Moodsi Interest.

Moodma pole wiele-do-wielu interests(czyli a models.ManyToManyField(Interest)).

Tworzę instancję Moodsnazwaną my_mood. W my_moodspolu zainteresowań mam my_interest, to znaczy

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

Jak usunąć my_interestz programu my_moodbez usuwania jednej z instancji modelu? Innymi słowy, jak usunąć relację bez wpływu na powiązane modele?

Nachshon Schwartz
źródło

Odpowiedzi:

183
my_mood.interests.remove(my_interest)

Dokumentacja relacji Django

Uwaga: przed wykonaniem tego kodu może być konieczne pobranie instancji my_moodi my_interestużycie interfejsu API QuerySet Django .

DrTyrsa
źródło
3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Cerin
1
aby dodać kolejnyentry my_mood.interests.add(my_interest)
Zohab Ali
65

Jeśli chcesz usunąć wszystkie odniesienia M2M bez dotykania znajdujących się pod nimi obiektów, łatwiej jest pracować z innego kierunku:

interest.mood_set.clear()

Chociaż nie odnosi się to bezpośrednio do pytania PO, często jest przydatne w tej sytuacji.

shacker
źródło
10
Dlaczego ten głos został odrzucony? To prawda, że ​​nie odnosi się konkretnie do pytania PO, ale zostawiłem odpowiedź, ponieważ jest ona szczególnie interesująca dla osób borykających się z usuwaniem relacji w kontekstach M2M i eliminuje potrzebę pętli przez instancje. Pomyślałem, że to pomocna wskazówka.
shacker
2
To było dla mnie po prostu przydatne (miałem zamiar przejść przez pętlę i nie chciałem). Dzięki za wysłanie!
bwv549
1
mogłoby być lepiej, gdybyś dodał ten punkt w powyższej odpowiedzi
brainLoop
1
Lub z podobnym imieniem w modelach iinterest.relatedname.clear()
Josh
11

W twoim przypadku możesz po prostu wyczyścić związek

my_mood.interests.clear()

Być może wtedy, gdy ponownie tworzysz nową relację w swoim serializatorze, możesz zrobić coś takiego

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
Sabyasachi
źródło