175 votes

Django supprime un objet d'une relation ManyToMany

Comment supprimer un objet d'une relation Many-to-Many sans supprimer l'objet lui-même ?

Ejemplo:

J'ai les modèles Moods y Interest .

Mood a un champ "plusieurs à plusieurs" (many-to-many) interests (qui est un models.ManyToManyField(Interest) ).

Je crée une instance de Moods appelé my_mood . En my_moods Le domaine d'intérêt de l my_interest , c'est-à-dire

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

Comment supprimer my_interest de my_mood sans supprimer l'une ou l'autre instance de modèle ? En d'autres termes, comment supprimer la relation sans affecter les modèles associés ?

282voto

DrTyrsa Points 14349
my_mood.interests.remove(my_interest)

Docs sur les relations de Django

Remarque : il se peut que vous deviez obtenir une instance de my_mood y my_interest en utilisant API QuerySet de Django avant de pouvoir exécuter ce code.

120voto

shacker Points 3348

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, c'est souvent utile dans cette situation.

23voto

Sabyasachi Points 581

Dans votre cas, vous pouvez simplement effacer la relation

my_mood.interests.clear()

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

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

-1voto

Himaloy Mondal Points 11

model.field.remove(object_you_want_to_remove)
Dans ce cas, utilisez : my_mood.interests.remove(my_interest)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X