如何在Django多对多关系中删除中间模型的实例?

时间:2009-11-28 16:33:57

标签: django django-models many-to-many instance

根据example,我有三种模式:

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

添加成员有效。但是如何删除单个Membership实例 (用户退出组),既不删除用户,也不删除组?

当我尝试删除它时:

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

我收到错误:

  

/ groups / quit / 1 /

中的AssertionError      

无法删除成员资格对象,因为其id属性设置为   无。

2 个答案:

答案 0 :(得分:17)

在第

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

您创建了一个未从数据库中获取的新Membership。这就是为什么它的id属性设置为None。

也许你的意思是

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

答案 1 :(得分:4)

此特定错误由以下事实触发:mMembership实例未保存,因此其主键为None。显然,删除这样一个未保存的实例是不可能的(这是有道理的,因为没有什么可以“删除”)。