Django模型减法问题


class Finances(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
student_name = models.CharField(max_length=100, default={Student.student_name})
total_fees = models.IntegerField(default=3500)
paid_amount = models.IntegerField(default=0)
balance = total_fees - paid_amount
balance_fees = models.IntegerField({balance})

我需要balance_fees模型来保存余额所持有的total_fees-paid_amount的减法值。进行迁移时出错"TypeError:-:"IntegerField"one_answers"IntegerField'的操作数类型不受支持

我该如何解决此问题?

您有几个选项吗:

选项1python属性

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
  • 优点:总是最新的
  • 缺点:不便于索引(您不能通过此字段为数据库建立索引,因为它不在数据库上(

选项2django模型属性更新覆盖保存:

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
  • 优点:索引友好,您可以在查询中包含此字段
  • 缺点:保存后才更新

在模型中创建一个方法:

@property
def  balance(self):
val = self.total_fees - self.paid_amount
return val

删除旅游模型上的这两行:

balance = total_fees - paid_amount
balance_fees = models.IntegerField({balance})

现在,您可以在视图和模板中使用平衡作为模型的字段