这些是我的模特:
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'.
有什么想法吗?
谢谢
答案 0 :(得分:0)
您要将未保存的stockitem(Stockdata)对象分配给OneToOneField,因此会引发错误。
当您将stockitem(Stockdata)对象分配给OneToOneField时,不会生成ID,因为您尚未保存stockitem对象,因此错误提示在保存Stock_journal模型时会导致数据丢失。
答案 1 :(得分:0)
pre_save
比post_save
具有different arguments。使用created
时,实际上是在使用raw
。
此时,当您调用Stock_journal.objects.create
时,实例甚至都没有保存(即存在于数据库中),因此无法在instance
创建中使用Stack_journal
。
有关django文档中raw的更多信息:
原始- 一个布尔值;如果模型的保存与显示的完全相同(即在加载夹具时),则为True。一个不应该查询/修改其他记录 数据库,因为数据库可能尚未处于一致状态。