使用pre_save信号保存模型实例

问题描述 投票:0回答:2

这些是我的模特:

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

知道怎么做吗?

谢谢

django django-models django-signals
2个回答
0
投票

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

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


0
投票

qazxsw poi有qazxsw poi而不是qazxsw poi。当你使用qazxsw poi时,你实际上正在使用pre_save

当你调用different arguments时,你的实例甚至没有保存(即存在于数据库中),因此你不能在post_save创建中使用created

更多关于来自django docs的raw:

raw - 布尔值;如果模型完全按照所呈现的方式保存(即加载夹具时),则为真。不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态。

© www.soinside.com 2019 - 2024. All rights reserved.