Django:如何使用pre_save信号更新模型实例?
我想创建一个pre_save信号,它将在发送方更新时更新已经创建的模型实例。我想在pre_save信号中这样做 将删除模型的上一个实例并创建新实例,或者更新上一个实例 我的模型:Django:如何使用pre_save信号更新模型实例?,django,django-models,django-signals,Django,Django Models,Django Signals,我想创建一个pre_save信号,它将在发送方更新时更新已经创建的模型实例。我想在pre_save信号中这样做 将删除模型的上一个实例并创建新实例,或者更新上一个实例 我的模型: class Sales(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True) company =
class Sales(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
party_ac = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='partyledgersales')
sales = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='saleledger')
date = models.DateField(default=datetime.date.today,blank=False, null=True)
sub_total = models.DecimalField(max_digits=10,decimal_places=2,blank=True, null=True)
class Journal(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
company = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companyname')
voucher_id = models.PositiveIntegerField(blank=True,null=True)
date = models.DateField(default=datetime.date.today)
by = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='Debitledgers')
to = models.ForeignKey(Ledger1,on_delete=models.CASCADE,related_name='Creditledgers')
debit = models.DecimalField(max_digits=10,decimal_places=2,null=True)
credit = models.DecimalField(max_digits=10,decimal_places=2,null=True)
我的创建前保存信号:
@receiver(pre_save, sender=Sales)
def user_created_sales(sender,instance,*args,**kwargs):
if instance.sub_total != None:
Journal.objects.update_or_create(user=instance.user,company=instance.company,date=instance.date,voucher_id=instance.id,by=instance.party_ac,to=instance.sales,debit=instance.sub_total,credit=instance.sub_total)
我想创建一个信号,每当发送方模型或销售
模型更新或删除以前的实例或创建新实例时,该信号将更新日志
实例
你知道怎么做吗
谢谢
更新或创建
采用两组参数:
这些参数唯一标识要从数据库中获取的行kwargs
应更新的参数默认值
Journal
的现有实例,因为您没有指定默认值。您正在寻找与所有参数匹配的实例,如果存在一个实例,则不执行任何操作,如果不存在,则创建它
您还没有告诉我们是什么使日记账
分录独特(以及它与销售
分录的关系,因为它们之间没有外汇键
关系)。
更新:使用凭证id
,您现在可以查找相应的日记帐
分录
但有点像:
Journal.objects.update_or_create(
user=instance.user,
company=instance.company,
voucher_id=instance.id,
defaults={
'date': instance.date,
'debit': instance.sub_total,
'credit': instance.sub_total,
'by': instance.party_ac,
'to': instance.sales}
)
将查找具有相同用户
、公司
和凭证id
的现有实例,并更新日期
、由
、至
、贷方
和借方您正在向我们显示的预保存信号处理程序的代码。它不起作用吗?还是会引起错误?或者它做了一些意想不到的事情?解释您当前的代码正在做什么。它工作正常。我只是想为更新创建另一个pre_save信号,即当发送方被更新(未创建)时,它将更新它先前创建的日志模型的相同实例。或者,它将删除以前的实例并创建一个新实例。这可能会有帮助,但问题仍然存在。。。它一直在创建一个新实例是什么使得日志
实例对销售
实例是唯一的?基于什么获取现有的日志实例?有没有办法删除以前的条目并创建一个新条目?同样,如何定义“以前的”条目?根据哪些参数,您知道要获取哪个条目?即哪个日记帐分录“属于”销售分录?为什么你没有一个从日记账到销售的外键呢?那么就没有办法知道哪个日记账
条目是“上一个”条目。您需要在Sales
对象上有一些唯一的参数或参数组合,用于定义相应的Journal
对象。