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'的操作数类型不受支持
我该如何解决此问题?
您有几个选项吗:
选项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
- 优点:索引友好,您可以在查询中包含此字段
- 缺点:保存后才更新
在模型中创建一个方法:
@property
def balance(self):
val = self.total_fees - self.paid_amount
return val
删除旅游模型上的这两行:
balance = total_fees - paid_amount
balance_fees = models.IntegerField({balance})
现在,您可以在视图和模板中使用平衡作为模型的字段