Django rimuove l'oggetto dalla relazione ManyToMany


112

Come eliminare un oggetto da una relazione molti a molti senza rimuovere l'oggetto effettivo?

Esempio:

Ho i modelli Moodse Interest.

Moodha un campo molti-a-molti interests(che è un models.ManyToManyField(Interest)).

Creo un'istanza di Moodscall my_mood. Nel my_moodscampo degli interessi di ho my_interest, significato

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

Come faccio a rimuovere my_interestda my_moodsenza eliminare nessuna delle istanze del modello? In altre parole, come rimuovo la relazione senza influire sui modelli correlati?

Risposte:



65

Se è necessario rimuovere tutti i riferimenti M2M senza toccare gli oggetti sottostanti, è più facile lavorare dall'altra direzione:

interest.mood_set.clear()

Sebbene ciò non affronti direttamente la domanda dell'OP, è spesso utile in questa situazione.


10
Perché è stato downvoted? Certo, non affronta specificamente la domanda dell'OP, ma ho lasciato la risposta perché è di specifico interesse per le persone alle prese con la rimozione delle relazioni in contesti M2M e rimuove la necessità di eseguire il loop delle istanze. Ho pensato che fosse un utile suggerimento correlato.
shacker

2
Questo è stato solo utile per me (stavo per eseguire il loop e non volevo). Grazie per averlo postato!
bwv549

1
potrebbe essere meglio se aggiungi questo punto nella risposta sopra
brainLoop

1
O con il nome correlato nei modelli einterest.relatedname.clear()
Josh

11

Nel tuo caso puoi semplicemente cancellare la relazione

my_mood.interests.clear()

Quindi forse quando crei di nuovo una nuova relazione nel tuo serializzatore puoi fare qualcosa del genere

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.