首页 > 解决方案 > 使用 pre_save 信号保存模型实例

问题描述

这些是我的模型:

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'.

知道怎么做吗?

谢谢

标签: djangodjango-modelsdjango-signals

解决方案


您正在将未保存的 stockitem(Stockdata) 对象分配给 OneToOneField ,因此会引发错误。

当您将 stockitem(Stockdata) 对象分配给 OneToOneField 时,不会生成 Id,因为您尚未保存 stockitem 对象,因此错误表示在保存 Stock_journal 模型时会导致数据丢失。


推荐阅读