【问题标题】:Django models subtraction issueDjango模型减法问题
【发布时间】:2021-09-07 08:59:36
【问题描述】:
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: unsupported operand type(s) for -: 'IntegerField' and 'IntegerField'

我该如何解决这个问题?

【问题讨论】:

    标签: python django django-models model web-deployment


    【解决方案1】:

    你有几种选择:

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

    【讨论】:

      【解决方案2】:

      在你的模型上创建一个方法:

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

      去掉游览模型上的这两行:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 2012-05-24
        • 2021-04-23
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多