django - Django:如何使用 pre_save 信号更新模型实例?
问题描述
我想创建一个 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
模型更新或删除先前实例或创建新实例时更新实例。
知道如何执行此操作吗?
谢谢
解决方案
update_or_create
接受两组参数:
kwargs
哪些是唯一标识要从数据库中获取的行的参数defaults
哪些是应该更新的参数
现在,您永远不会更新 的现有实例,Journal
因为您没有指定defaults
. 您正在寻找与所有参数匹配的实例,如果存在,则不执行任何操作,如果不存在,则创建它。
您还没有告诉我们是什么使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
推荐阅读
- class - 如何在使用 pyknow 开发基于知识的系统中调用要由 tkinter 按钮执行的类对象
- java - Selenium Java WebDriverWait - 无法访问 java.util.function
- java - 用于读取 bean 的 Java 代理
- visual-studio-code - VSCODE:无法读取未定义的属性“本地”
- node.js - 当我使用 console.log 缓冲区时,VS Code 自动将十六进制更改为十进制
- python - 获取 127.0.1.1 而不是 192.168.1.* ip ubuntu python
- c++ - C++/CLI 本机类中的函数是否编译为 MSIL 或本机 x64 机器代码?
- angular - 无法从控制器动态禁用 FormArray(Angular 5)
- arduino - 如何解决这个错误“avrdude: error reading signature data, rc=-67”?
- jquery - 创建外部数据表按钮