【问题标题】:Django post save signal not updating the databaseDjango post save 信号不更新数据库
【发布时间】:2020-10-01 21:43:00
【问题描述】:

我不明白为什么这个信号不起作用。同样的代码工作了一次,但之后我从管理员中删除了对象并再次运行它并停止工作。

@receiver(post_save, sender=FinancePending)
def calcualate_FinancePending(sender, instance, created, **kwargs):
amount_paid = FinancePending.objects.values_list('amountPaid', flat=True)
amount_paid = list(amount_paid)
total_amount = FinancePending.objects.values_list('TotalAmount', flat=True)
total_amount = list(total_amount)

# total - paid
TotalFee = [int(s.replace(',', '')) for s in total_amount]
AmountPaid = [int(s.replace(',', '')) for s in amount_paid]
finance_pending = FinancePending.objects.all()
i = 1

while i <= len(TotalFee):
    amount_pending = TotalFee[i-1] - AmountPaid[i-1]
    amountpending = FinancePending.objects.filter(invoiceNumber=i)
    amountpending.AmountPending = amount_pending
    i = 1 + i

【问题讨论】:

    标签: python django django-models django-signals


    【解决方案1】:

    因为信号post_save 仅在调用 save() 方法后触发。你应该改用post_delete

    【讨论】:

      【解决方案2】:

      您没有调用save() 方法,这就是它不保存的原因。但我不认为这是 django 的优化实现。您可以使用update() 简单地尝试这样:

      from django.db.models import F
      
      @receiver(post_save, sender=FinancePending)
      def calcualate_FinancePending(sender, instance, created, **kwargs):
          FinancePending.objects.update(AmountPending=F('TotalAmount')-F('amountPaid'))
      

      此外,更新每个对象并创建FinancePending 的一个实例是没有意义的。可能您应该只更新创建的对象。像这样:

      @receiver(post_save, sender=FinancePending)
      def calcualate_FinancePending(sender, instance, created, **kwargs):
          instance.AmountPending=instance.TotalAmount-instance.amountPaid
          instance.save()
      

      最后,请在命名属性和函数名称时遵循pep8 style guide

      【讨论】:

      • 问题是我从 csv 导入批量数据。其中未决列为空。
      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2015-02-24
      • 2012-08-14
      • 2016-11-19
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多