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

我有一个模型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() 方法来实现,但没有任何效果


子衿沉夜
浏览 91回答 1
1回答

幕布斯6054654

信号应该适合您在这里想要的。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'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python