self.delete()给出错误:“实例需要在可以使用多对多关系之前拥有主键值”

时间:2012-07-13 01:48:22

标签: django django-models

我有三个型号。我们称之为Mod1,Mod1Request和UserProfile。

Mod1Request看起来像:

class Mod1Request(models.Model):
date_requested = models.DateField(auto_now_add=True)
mod1s = models.ManyToManyField('Mod1')
user = models.ForeignKey(User)
approved = models.BooleanField()
def save(self, *args, **kwargs):
    if self.approved:
        for c in list(self.mod1s.all()):
            mod = mod1.objects.get(id=c.id)
            self.user.get_profile().mod1s.add(mod)
        self.delete()
    else:
        super(Mod1Request, self).save(*args, **kwargs)

然后UserProfile有一个'mod1s'属性,它是一个到Mod1的ManyToManyField。我想要完成的是: 保存Mod1Request时,如果设置了Approved,则将Mod1Request中列出的Mod1添加到UserProfile,然后删除Mod1Request本身。

此功能一直有效,直到删除自身为止。如果我删除self.delete()行,则Mod1Request中的Mod1实例将正确添加到UserProfile.mod1s。但是,如果我留下它,我会收到以下错误:

'Mod1Request' instance needs to have a primary key value before a many-to-many relationship can be used.

非常感谢任何帮助。

编辑:我应该澄清一个用户在表单中输入Mod1Request,然后由另一个(管理员)用户批准。因此管理员用户检查已批准并“保存”Mod1Request。然后,Mod1Request应该将Mod1添加到UserProfile并删除它自己。

1 个答案:

答案 0 :(得分:0)

只需删除self.delete() - 您不需要它。因为您没有为批准的对象调用超类save方法,所以它们实际上从未保存到数据库中。