为了账号安全,请及时绑定邮箱和手机立即绑定

根据其他模型 Django 的值更改模型的值

根据其他模型 Django 的值更改模型的值

子衿沉夜 2023-08-15 16:38:35
我有一个模型Wallet和StudentPayment. 每次我添加或更新 StudentPayment 时,Wallet余额都应根据添加或更新的情况而变化StudentPayment。class Wallet(models.Model):    ...    balance = models.DecimalField(decimal_places=2, max_digits=100, default=0.00)    ...class StudentPayment(models.Model):    ...    wallet = models.ForeignKey(                 Wallet,                  on_delete=models.SET_NULL,                  null=True, related_name='students_payment')    amount = models.DecimalField(decimal_places=2, max_digits=100)    ...例如:如果我添加1000金额的付款,钱包余额也应该更改为1000,我知道该怎么做,但不知道如何处理更新,例如:如果我将付款金额更改为900,钱包余额也应该发生变化。感谢任何帮助)我尝试使用重写 save() 方法来实现,但没有任何效果
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

信号应该适合您在这里想要的。StudentPayment在某些操作(例如保存或删除对象)后会触发信号,以便您可以在保存或删除对象时执行功能。


此时,您可能希望余额Wallet是支付给该钱包的所有金额的总和。


    from django.db.models import Sum

    from django.db.models.signals import (

        post_delete,

        post_save,

    )

    from django.dispatch import receiver



    class Wallet(models.Model):

        ...

        balance = models.DecimalField(decimal_places=2, max_digits=100, default=0.00)

        ...

    


    class StudentPayment(models.Model):

        ...

        wallet = models.ForeignKey(

                     Wallet, 

                     on_delete=models.SET_NULL, 

                     null=True, related_name='students_payment')

    

        amount = models.DecimalField(decimal_places=2, max_digits=100)

        ...



    @receiver([post_save, post_delete], sender=StudentPayment)

    def calculate_total_amount(instance, **kwargs):

     

        wallet = instance.wallet


        # Add together the amount of all `StudentPayment` objects for the wallet

        total = StudentPayment.objects.filter(wallet=wallet).aggregate(

            Sum('amount')

        )['amount__sum']


        wallet.balance = total

        wallet.save(update_fields=['balance'])


查看完整回答
反对 回复 2023-08-15
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信