Django 使用save()命令后未更新onetoonefied值

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 =

我试图从OneToOneField的默认值(None)更新它的值,但一切似乎都不起作用,因为当我调用save()时,更改不会写入数据库。 相反,如果我从管理控制台更改值,一切都会正常工作

My 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()
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.
因此,基本上首先需要创建一个
支付
实例: