Comment supprimer une instance d'un modèle intermédiaire dans une relation plusieurs-à-plusieurs Django?

StackOverflow https://stackoverflow.com/questions/1812959

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.

Était-ce utile?

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").

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top