你有几种选择:
选项 1:python 属性
class Finances(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
student_name = models.CharField(max_length=100, ... )
total_fees = models.IntegerField(default=3500)
paid_amount = models.IntegerField(default=0)
@property
def balance_fees(self):
return self.total_fees - self.paid_amount
- 优点:始终保持最新状态。
- 缺点:对索引不友好(您不能按此字段索引数据库,因为不在数据库中)
选项 2:django 模型属性 更新覆盖保存:
class Finances(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
student_name = models.CharField(max_length=100, ... )
total_fees = models.IntegerField(default=3500)
paid_amount = models.IntegerField(default=0)
balance_fees = models.IntegerField(default=0)
def save(self, *args, **kwargs):
self.balance_fees = self.total_fees - self.paid_amount
super().save(*args, **kwargs)
- 优点:索引友好,您可以在查询中包含此字段。
- 缺点:保存后才更新。
选项 3:通过预保存信号更新的 django 模型属性:
class Finances(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
student_name = models.CharField(max_length=100, ... )
total_fees = models.IntegerField(default=3500)
paid_amount = models.IntegerField(default=0)
balance_fees = models.IntegerField(default=0)
# ---
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Finances
@receiver(pre_save, sender=Finances)
def my_handler(sender, **kwargs):
sender.balance_fees = sender.total_fees - sender.paid_amount
- 优点:索引友好,您可以在查询中包含此字段。
- 缺点:保存后才更新。