Django quitar objeto de ManyToMany relación


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

Ejemplo:

Tengo los modelos Moods y Interest.

'Estado de ánimo' tiene un campo de muchos a muchos interests (que es un models.ManyToManyField(Interest)).

Creo una instancia de Moods llamada my_mood. En el campo de intereses de my_moods tengo my_interest, lo que significa

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

¿Cómo elimino my_interest de my_mood sin eliminar ninguna instancia del modelo? En otras palabras, ¿cómo puedo eliminar la relación sin afectar los modelos relacionados?

Author: Tom Leys, 2011-06-13

3 answers

my_mood.interests.remove(my_interest)

Relaciones de Django Docs

Nota: es posible que tenga que obtener una instancia de my_mood y my_interestusando la API QuerySet de Django antes de poder ejecutar este código.

 120
Author: DrTyrsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 11:04:20

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()
 18
Author: shacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-05 07:02:27

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()
 1
Author: Sabyasachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 06:18:08