使用 pre_save 信号保存模型实例
Saving model instance using pre_save signal
这些是我的模型:
class Stockdata(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_stock')
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
stock_name = models.CharField(max_length=32)
class Stock_journal(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_closing')
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
stockitem = models.OneToOneField(Stockdata,on_delete=models.CASCADE,null=True,blank=True,related_name='closingstock')
closing_stock = models.DecimalField(max_digits=10,decimal_places=2,null=True)
这是我的信号:
@receiver(post_save, sender=Stockdata)
def create_default_stock_ledger(sender, instance, created, **kwargs):
if created:
Stock_journal.objects.create(user=instance.User,company=instance.Company,stockitem=instance)
我想传递与我在 post_save 信号中所做的相同的 pre_save 信号,即我想执行 pre_save 信号功能而不是 post_save信号..
当我尝试使用 pre_save 信号时,出现以下错误:
save() prohibited to prevent data loss due to unsaved related object 'stockitem'.
知道怎么做吗?
谢谢
您正在将未保存的 stockitem(Stockdata) 对象分配给 OneToOneField,因此会引发错误。
当您将 stockitem(Stockdata) 对象分配给 OneToOneField 时,不会生成 Id,因为您没有保存 stockitem 对象,因此正如错误所说,它会在保存 Stock_journal 模型时导致数据丢失。
pre_save
比 post_save
多 different arguments。当你使用created
时,你实际上是在使用raw
。
那时当你调用 Stock_journal.objects.create
时,你的实例甚至没有保存(即存在于数据库中),因此你不能在 Stack_journal
创建中使用 instance
。
来自 django 文档的更多关于 raw 的信息:
raw -
A boolean; True if the model is saved exactly as presented (i.e. when loading a fixture). One should not query/modify other records in
the database as the database might not be in a consistent state yet.
这些是我的模型:
class Stockdata(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_stock')
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
stock_name = models.CharField(max_length=32)
class Stock_journal(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_closing')
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
stockitem = models.OneToOneField(Stockdata,on_delete=models.CASCADE,null=True,blank=True,related_name='closingstock')
closing_stock = models.DecimalField(max_digits=10,decimal_places=2,null=True)
这是我的信号:
@receiver(post_save, sender=Stockdata)
def create_default_stock_ledger(sender, instance, created, **kwargs):
if created:
Stock_journal.objects.create(user=instance.User,company=instance.Company,stockitem=instance)
我想传递与我在 post_save 信号中所做的相同的 pre_save 信号,即我想执行 pre_save 信号功能而不是 post_save信号..
当我尝试使用 pre_save 信号时,出现以下错误:
save() prohibited to prevent data loss due to unsaved related object 'stockitem'.
知道怎么做吗?
谢谢
您正在将未保存的 stockitem(Stockdata) 对象分配给 OneToOneField,因此会引发错误。
当您将 stockitem(Stockdata) 对象分配给 OneToOneField 时,不会生成 Id,因为您没有保存 stockitem 对象,因此正如错误所说,它会在保存 Stock_journal 模型时导致数据丢失。
pre_save
比 post_save
多 different arguments。当你使用created
时,你实际上是在使用raw
。
那时当你调用 Stock_journal.objects.create
时,你的实例甚至没有保存(即存在于数据库中),因此你不能在 Stack_journal
创建中使用 instance
。
来自 django 文档的更多关于 raw 的信息:
raw - A boolean; True if the model is saved exactly as presented (i.e. when loading a fixture). One should not query/modify other records in the database as the database might not be in a consistent state yet.