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?

Respuestas:



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.


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()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.