Django eliminando objeto de la relación ManyToMany

112

¿Cómo eliminaría un objeto de una relación de varios a varios sin eliminar el objeto real?

Ejemplo:

Tengo los modelos Moodsy Interest.

Moodtiene un campo de varios a varios interests(que es a models.ManyToManyField(Interest)).

Creo una instancia de Moodsllamado my_mood. En my_moodsel campo de intereses que tengo my_interest, es decir

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

¿Cómo se quita my_interestde my_moodsin borrar cualquier caso modelo? En otras palabras, ¿cómo elimino la relación sin afectar los modelos relacionados?

Nachshon Schwartz
fuente

Respuestas:

183
my_mood.interests.remove(my_interest)

Documentos de relaciones de Django

Nota: puede que tenga que obtener una instancia de my_moody my_interestel uso de la API QuerySet de Django antes de poder ejecutar este código.

DrTyrsa
fuente
3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Cerin
1
para agregar otroentry my_mood.interests.add(my_interest)
Zohab Ali
65

Si necesita eliminar todas las referencias M2M sin tocar los objetos subyacentes, es más fácil trabajar desde la otra dirección:

interest.mood_set.clear()

Si bien esto no aborda directamente la pregunta del OP, a menudo es útil en esta situación.

coctelera
fuente
10
¿Por qué se votó en contra? Por supuesto, no aborda específicamente la pregunta del OP, pero dejé la respuesta porque es de interés específico para las personas que se enfrentan a la eliminación de relaciones en contextos M2M y elimina la necesidad de recorrer instancias. Pensé que era un consejo relacionado útil.
shacker
2
Esto fue útil para mí (estaba a punto de recorrer y no quería). ¡Gracias por publicarlo!
bwv549
1
podría ser mejor si solo agrega este punto en la respuesta anterior
brainLoop
1
O con nombre relacionado en modelos yinterest.relatedname.clear()
Josh
11

En su caso, simplemente puede borrar la relación

my_mood.interests.clear()

Entonces tal vez cuando vuelva a crear una nueva relación en su serializador, pueda hacer algo como esto

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