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?

Odpowiedzi:



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.


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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.