2011-06-13 627 views
58

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

Ejemplo:

I tienen 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 los intereses de my_moods tengo my_interest, lo que significa

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

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

Respuesta

96
my_mood.interests.remove(my_interest) 

Django's Relations Docs

Nota: puede que tenga que obtener una instancia de my_mood y my_interest usando Django's QuerySet API antes de poder ejecutar este código.

+0

y esto no lo eliminará del modelo de interés? – Nayish

+1

@nayish No, no lo hará. Pero, ¿por qué no intentarlo tú mismo? – DrTyrsa

+17

mejor que la documentación de Django –

7

Si es necesario 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() 
+0

¿Por qué se bajó este valor? De acuerdo, no aborda específicamente la pregunta del OP, pero dejé la respuesta porque es de interés específico para las personas que luchan por eliminar relaciones en contextos M2M, y elimina la necesidad de recorrer las instancias. Pensé que era un consejo relacionado útil. – shacker

+0

Todavía te amo. No dejes que los collares te depriman. –

+0

Esto fue útil para mí (estaba a punto de recorrerlo y no quería). ¡Gracias por publicarlo! – bwv549

0

En su caso, usted puede simplemente borrar la relación

my_mood.interests.clear() 

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

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