Come posso eliminare un'istanza di un modello intermedio in una relazione Many-to-many di Django?
-
06-07-2019 - |
Domanda
Secondo un esempio , ho tre modelli:
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()
L'aggiunta di membri funziona. Ma come posso eliminare una singola istanza di appartenenza (un utente abbandona un gruppo), senza eliminare né l'utente né il gruppo?
Quando provo a eliminarlo in questo modo:
u = User(request.user)
g = Group.objects.get(id=group_id, membership__user=u)
m = Membership(user=request.user, group=g)
m.delete()
Ricevo un errore:
AssertionError su / groups / quit / 1 /
L'oggetto appartenenza non può essere eliminato perché l'attributo id è impostato su Nessuno.
Soluzione
Nella linea
m = Membership(user=request.user, group=g)
Hai creato un nuovo Iscrizione
che non hai recuperato dal database. Ecco perché il suo attributo id è impostato su Nessuno.
Forse intendevi
m = Membership.objects.get(user=request.user, group=g)
Altri suggerimenti
Questo particolare errore è innescato dal fatto che la tua m
istanza della classe appartenenza
non è salvata, quindi la sua chiave primaria è None. Apparentemente, è impossibile eliminare un'istanza del genere non salvata (il che ha senso, perché non c'è nulla da "cancellare").