Wie kann ich eine Instanz eines Zwischenmodell in einer Django Many-to-many-Beziehung löschen?
-
06-07-2019 - |
Frage
Nach einem Beispiel , ich habe drei Modelle:
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()
Hinzufügen von Mitgliedern funktionieren. Aber wie lösche ich eine einzelne Mitgliedschaft-Instanz (A Benutzer verlässt eine Gruppe), ohne sie zu löschen weder der Benutzer noch die Gruppe?
Wenn ich versuche, es so zu löschen:
u = User(request.user)
g = Group.objects.get(id=group_id, membership__user=u)
m = Membership(user=request.user, group=g)
m.delete()
Ich erhalte eine Fehlermeldung:
AssertionError bei / Gruppen / quit / 1 /
Die Mitgliedschaft Objekt kann nicht gelöscht werden, da sein id-Attribut gesetzt ist Keine.
Lösung
In der Zeile
m = Membership(user=request.user, group=g)
Sie haben ein neues Membership
Sie nicht einer aus der Datenbank holen war. Deshalb ist sein id-Attribut auf None gesetzt ist.
Vielleicht bedeuten Du
m = Membership.objects.get(user=request.user, group=g)
Andere Tipps
Dieser spezielle Fehler wird durch die Tatsache ausgelöst, dass Ihre m
Instanz der Klasse Membership
nicht gespeichert ist, so dass ihr Primärschlüssel Keine ist. Offenbar ist es nicht möglich, eine solche nicht gespeicherte Instanz zu löschen (was Sinn macht, weil es nichts zu „löschen“).