我想创建一个pre_save信号,该信号将在发送方更新时更新已经创建的模型实例。我想在pre_save信号中做到这一点。
将删除模型的先前实例,并创建新实例或更新先前实例。
我的模特:
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)
我的pre_save创建信号:
@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)
我想创建一个信号,每当发送者模型或Journal
模型被更新或删除前一个实例或创建一个新实例时,它都会更新Sales
实例。
您知道如何执行此操作吗?
谢谢
答案 0 :(得分:1)
update_or_create
具有两组参数:
kwargs
是唯一标识要从数据库中提取行的参数defaults
是应更新的参数目前,您从未更新过Journal
的现有实例,因为尚未指定defaults
。您正在寻找与 all 参数匹配的实例,如果存在,则不执行任何操作,如果不存在,则创建它。
您尚未告诉我们是什么使Journal
项与众不同(以及它们与Sales
项之间的关系,因为它们之间没有ForeignKey
的关系)。
更新:使用voucher_id
,您现在可以查找相应的Journal
条目。
但是类似:
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}
)
将查找具有相同的user
,company
和voucher_id
的现有实例,并更新date
,by
,to
, credit
和debit
。