¿Cómo elimino una instancia de un modelo intermedio en una relación de muchos a muchos de Django?
-
06-07-2019 - |
Pregunta
De acuerdo con una ejemplo , tengo tres modelos:
class User(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(User, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(User)
group = models.ForeignKey(Group)
date_joined = models.DateField()
Agregar miembros funciona. Pero, ¿cómo elimino una sola instancia de Membresía? (un usuario sale de un grupo), sin eliminar ni el usuario ni el grupo?
Cuando intento eliminarlo así:
u = User(request.user)
g = Group.objects.get(id=group_id, membership__user=u)
m = Membership(user=request.user, group=g)
m.delete()
Me sale un error:
AssertionError en / groups / quit / 1 /
El objeto de membresía no se puede eliminar porque su atributo id está establecido en Ninguno.
Solución
En la línea
m = Membership(user=request.user, group=g)
Creó una nueva Membresía
que no obtuvo una de la base de datos. Es por eso que su atributo id está establecido en Ninguno.
Quizás quisiste decir
m = Membership.objects.get(user=request.user, group=g)
Otros consejos
Este error particular se desencadena por el hecho de que su instancia de m
de la clase Membership
no se ha guardado, por lo que su clave principal es None. Aparentemente, es imposible eliminar una instancia no guardada (lo cual tiene sentido, porque no hay nada que "eliminar").