我正在尝试从默认值(无)更新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:正如我所说,如果我从管理界面手动设置付款,一切正常。
答案 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()