web-dev-qa-db-fra.com

Django Suppression d'un objet de la relation ManyToMany

Comment supprimer un objet d'une relation plusieurs à plusieurs sans supprimer l'objet réel?

Exemple:

J'ai les modèles Moods et Interest.

Mood possède un champ plusieurs-à-plusieurs interests (qui est une models.ManyToManyField(Interest)).

Je crée une instance de Moods appelée my_mood. Dans le champ des intérêts de my_moods, J'ai my_interest, Ce qui signifie

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

Comment puis-je supprimer my_interest De my_mood Sans supprimer aucune instance de modèle? En d'autres termes, comment puis-je supprimer la relation sans affecter les modèles associés?

90
Nayish
my_mood.interests.remove(my_interest)

Docs Relations Django

Remarque: vous devrez peut-être obtenir une instance de my_mood et my_interest en utilisant API QuerySet de Django avant de pouvoir exécuter ce code.

153
DrTyrsa

Si vous devez supprimer toutes les références M2M sans toucher aux objets sous-jacents, il est plus facile de travailler dans l'autre sens:

interest.mood_set.clear()

Bien que cela ne réponde pas directement à la question du PO, il est souvent utile dans cette situation.

39
shacker

Dans votre cas, vous pouvez simplement effacer la relation

my_mood.interests.clear()

Alors peut-être que lorsque vous créez à nouveau une nouvelle relation dans votre sérialiseur, vous pouvez faire quelque chose comme ceci

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
8
Sabyasachi