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

Python Django-默认字段值取决于其他字段值,python,django,default-value,Python,Django,Default Value,设置默认字段值时遇到问题。我想做什么?我希望类包中的价格是priceNoTax-in-class-Bill的默认值。如您所见,这三个类都是 逻辑连接。示例:帐户1有一个id为1的包。这个包裹的价格是100美元。帐户1的priceNoTax的默认值为100。如何操作?我对这方面比较陌生,所以我需要帮助。 models.py class Packages(models.Model): #other fields price = models.IntegerField(valida


设置默认字段值时遇到问题。我想做什么?
我希望类包中的价格是priceNoTax-in-class-Bill的默认值。如您所见,这三个类都是 逻辑连接。
示例:帐户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

非常感谢

也许可以将此添加到您的Bill类中

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)

有关更多信息,请参见

@kichik回答了如何使用模板标记显示默认值,我建议使用javascript实现自动计算


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

这是为了保存,而不是为了具有默认值。您如何将信息获取到模型中?您是在使用管理员页面还是从其他位置传入?有几种方法可以实现这一点,但没有一种方法专门将默认属性设置为另一个模型的值。我不需要
priceNoTax
priceTax
字段,因为它们已经在逻辑上连接好了。如果您想以
Bill.objects.filter(idAccount\uu idPackage\uu price)
的形式访问价格,您只需从
Bill
类查询即可。减少重复变量。显示信息不是问题。这似乎是正确的答案。10年后。。。这种方法的一个问题是使用
models.F()
表达式无法访问
priceTax