Comment supprimer une instance d'un modèle intermédiaire dans une relation plusieurs-à-plusieurs Django?
-
06-07-2019 - |
Question
Selon un exemple , j’ai trois modèles:
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'ajout de membres fonctionne. Mais comment puis-je supprimer une seule instance d'adhésion (un utilisateur quitte un groupe), sans supprimer ni l'utilisateur ni le groupe?
Lorsque j'essaie de le supprimer comme ceci:
u = User(request.user)
g = Group.objects.get(id=group_id, membership__user=u)
m = Membership(user=request.user, group=g)
m.delete()
Je reçois une erreur:
AssertionError dans / groups / quit / 1 /
L'objet d'appartenance ne peut pas être supprimé car son attribut id est défini sur Aucun.
La solution
Dans la ligne
m = Membership(user=request.user, group=g)
Vous avez créé un abonnement
que vous n'avez pas récupéré dans la base de données. C’est pourquoi son attribut id est défini sur None.
Peut-être que vous vouliez dire
m = Membership.objects.get(user=request.user, group=g)
Autres conseils
Cette erreur particulière est provoquée par le fait que votre instance m
de classe Appartenance
n'est pas sauvegardée. Sa clé primaire est donc None. Apparemment, il est impossible de supprimer une telle instance non enregistrée (ce qui est logique car il n’ya rien à "supprimer").