Django - 默认字段值取决于其他字段值

Django - default field value depends on other field value


我在设置默认字段值时遇到问题。我想做什么?
我希望 class 包裹中的价格是 class 账单中的默认值 priceNoTax。如您所见,所有三个 class 都是 逻辑上连接。
示例:账户 1 有一个包裹 ID 为 1。这个包裹的价格是 100。账户 1 的 priceNoTax 的默认值为 100。

如何做?我在这方面比较陌生,所以我需要帮助。

models.py

class Packages(models.Model):
     #other fields
     price = models.IntegerField(validators=[MinValueValidator(1)], verbose_name="Price of package")

class Account(models.Model):
     startDate = models.DateField(verbose_name="Start date")
     finishDate = models.DateField(verbose_name="Finish date")
     idPackage = models.ForeignKey(Packages, on_delete=models.CASCADE, verbose_name="Package")

class Bill(models.Model):
     date = models.DateField(default=datetime.now())
     tax = models.FloatField(default=0.20)
     priceNoTax = models.IntegerField()
     priceTax = models.FloatField(default=priceNoTax+(priceNoTax*tax))
     idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account")

     def __str__(self):
         return self.date

非常感谢!!!

也许将此添加到您的账单中class?

def save(self, *args, **kwargs):
    if self.priceNoTax is None:
        self.priceNoTax = self.idAccount.idPackage.price
    super(Bill, self).save(*args, **kwargs)

为什么需要它是一个字段?您是否看到有人想要在不将价格和税费更改为相应值的情况下更改总价的原因?如果它真的不需要是一个字段,你可以把它做成一个方法。

class Bill(models.Model):
     date = models.DateField(default=datetime.now())
     tax = models.FloatField(default=0.20)
     priceNoTax = models.IntegerField()
     idAccount = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Account")

     def priceTax(self):
       return self.priceNoTax + (self.priceNoTax*self.tax)

     def __str__(self):
         return self.date

您仍然可以在 {{ bill.priceTax }} 的模板中以相同的方式使用它。在代码中,您需要使用 bill.priceTax().

这样,无论含税价格或不含税价格如何变化,含税价格都应保持最新。

您还可以使用 @property 装饰器来避免在代码中将其作为函数调用。

@property
def priceTax(self):
   return self.priceNoTax + (self.priceNoTax*self.tax)

有关更多信息,请参阅 https://docs.djangoproject.com/en/2.0/topics/db/models/#model-methods

@kichik 回答了如何使用模板标签显示默认值,我推荐javascript实现自动计算。

当然,您必须验证用户输入或实施 save() 方法,正如@Chris Curvey 所说。