使用save()命令后,OneToOneFiled值未更新

时间:2015-11-24 22:00:53

标签: django

我正在尝试从默认值(无)更新OneToOneField的值,一切似乎都解决了这样一个事实:当我调用save()时,更改不会写入数据库。 相反,如果我从管理控制台更改值,一切正常。

我的models.py看起来像这样:

class Payment(m.Model):
    [stuff...]

class Order(m.Model):
    [stuff...]
    active = m.BooleanField(default = False)
    payment = m.OneToOneField(Payment, null = True, blank = True, on_delete=m.SET_NULL)

我有一个激活订单的功能,如下所示:

def activate(self, ipn):
    [stuff..]
    self.payment = Payment(ipn = ipn)
    self.payment.save()
    self.active = True
    self.save()

我在订单上调用activate()后,活动值会正确设置为True,但付款值仍设置为无。我无法弄清楚出了什么问题。有什么想法吗?

Ps:正如我所说,如果我从管理界面手动设置付款,一切正常。

2 个答案:

答案 0 :(得分:1)

payment_id实例分配给Payment时,self.payment已设置。但是,Payment实例此时没有id。在将其分配给OneToOneField之前,您需要保存它。

def activate(self, ipn):
    [stuff..]
    payment = Payment(ipn = ipn)
    payment.save()
    self.payment = payment
    self.active = True
    self.save()

答案 1 :(得分:1)

如果您尝试在shell中运行激活代码,您可能会看到如下内容:

ValueError: Cannot assign "...." instance isn't saved in the database.

所以基本上首先需要创建一个Payment实例:

def activate(self, ipn):
    [stuff..]
    payment = Payment(ipn = ipn)
    payment.save()
    self.payment = payment
    self.active = True
    self.save()