Django 使用save()命令后未更新onetoonefied值
我试图从OneToOneField的默认值(None)更新它的值,但一切似乎都不起作用,因为当我调用save()时,更改不会写入数据库。 相反,如果我从管理控制台更改值,一切都会正常工作 My models.py的外观如下所示:Django 使用save()命令后未更新onetoonefied值,django,Django,我试图从OneToOneField的默认值(None)更新它的值,但一切似乎都不起作用,因为当我调用save()时,更改不会写入数据库。 相反,如果我从管理控制台更改值,一切都会正常工作 My models.py的外观如下所示: class Payment(m.Model): [stuff...] class Order(m.Model): [stuff...] active = m.BooleanField(default = False) payment =
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()
ValueError: Cannot assign "...." instance isn't saved in the database.
我有一个激活订单的函数,如下所示:
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()
ValueError: Cannot assign "...." instance isn't saved in the database.
在我对订单调用activate()后,活动值将正确设置为True,但付款值仍保持为None。我想不出是怎么回事。有什么想法吗
Ps:如我所说,如果我从管理界面手动设置付款,一切都会正常。当您将
付款
实例分配给self.payment
时,会设置付款id
。但是,支付
实例在该点没有id。在将其分配给OneToOneField
之前,需要先保存它
def activate(self, ipn):
[stuff..]
payment = Payment(ipn = ipn)
payment.save()
self.payment = payment
self.active = True
self.save()
def activate(self, ipn):
[stuff..]
payment = Payment(ipn = ipn)
payment.save()
self.payment = payment
self.active = True
self.save()
如果您尝试在shell中运行激活代码,您可能会看到如下内容:
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()
ValueError: Cannot assign "...." instance isn't saved in the database.
因此,基本上首先需要创建一个支付
实例: