How to remove an instance of an intermediate model in a Django Many-to-many relationship?

According to, I have three models:

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()

Adding items. But how to delete one instance of membership (the user leaves the group) without deleting either the user or the group?

When I try to remove it like this:

    u = User(request.user)
    g = Group.objects.get(id=group_id, membership__user=u)
    m = Membership(user=request.user, group=g)
    m.delete()

I get an error message:

AssertionError at / groups / quit / 1 /

The membership object cannot be deleted because its id attribute is set to None.

+3
source share
2 answers

In line

m = Membership(user=request.user, group=g)

You created a new Membershipone that you did not retrieve from the database. This is why its id attribute is set to None.

Did you mean

m = Membership.objects.get(user=request.user, group=g)
+17

, m Membership , - None. -, ( , "" ).

+4

Source: https://habr.com/ru/post/1724178/


All Articles