在基于类的模型的保存方法中访问“self”

时间:2017-05-31 22:07:27

标签: python django

我有两个看起来像这样的模型:

class ModelOne(models.Model):
    foo = models.CharField(max_length=25)

    def save(self,*args,**kwargs):
        a = ModelTwo.objects.get(pk=arbitrary_pk)
        a.somefield.add(self) # I am worried about this line here
        super(ModelOne,self).save(*args,**kwargs)

class ModelTwo(models.Model):
    somefield = models.ManyToManyField(ModelOne)

我要将self添加到a.somefield的行是我担心的行。我怎么能没有错误地做到这一点?目前,我得到了:

ValueError: Cannot add "<ModelOne>": the value for field "modelone" is None

提前致谢

4 个答案:

答案 0 :(得分:0)

您无法这样做,因为当您调用.add()时,您还没有保存模型。这意味着可能尚未创建模型(因此它还没有ID)。

基本上你告诉Django用一些尚未存在的东西(NULL)来更新外键,这会出错。您需要确保在设置外键之前已创建模型。

尝试将a.somefield.add(self)移动到super()调用之后。

答案 1 :(得分:0)

在调用实际保存方法之前,您无法将多个保存到may字段,您可以修改代码,

def save(self,*args,**kwargs):
    super(ModelOne,self).save(*args,**kwargs) # Here your self has been saved
    a = ModelTwo.objects.get(pk=arbitrary_pk)
    a.somefield.add(self) # Now your self can be add as ManyToMany as it is already saved in db

我希望这有帮助。

答案 2 :(得分:0)

在调用save方法后,将实例添加到多对多字段中。

class ModelOne(models.Model):
    foo = models.CharField(max_length=25)

    def save(self,*args,**kwargs):
        super(ModelOne,self).save(*args,**kwargs)
        a = ModelTwo.objects.get(pk=arbitrary_pk)
        a.somefield.add(self) #add self to the object manytomany.
        a.save() #save the object.

class ModelTwo(models.Model):
    somefield = models.ManyToManyField(ModelOne)

您需要先保存自我对象。多对多关系需要首先将相关对象保存在数据库中,以便定义关系。然后,使用a.somefield.add(self)定义关系。然后,保存a对象。否则,该关系将不会在数据库中提交。

答案 3 :(得分:0)

我最终使用post_save来实现这一点。