2016-08-21 144 views
8


我有一个问题来设置默认字段值。我想做的事?
我希望类包中的价格是类Bill中的priceNoTax的默认值。正如你所看到的,所有三个类都是逻辑连接的 。
例如:帐户1有一个ID为1的包。此包的价格为100.帐户1的priceNoTax的默认值为100.

如何做到这一点?我在这方面相对较新,所以我需要帮助。
Django - 默认字段值取决于其他字段值

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 

非常感谢!

+0

你如何将信息导入模型?您是使用管理页面还是从其他位置传入?我可以通过几种方式来做到这一点,但没有一种方法专门将默认属性设置为来自其他模型的值。 –

+0

您不需要'priceNoTax'和'priceTax'字段,因为它们*已经逻辑连接*。如果您想以“Bill.objects.filter(idAccount__idPackage__price)”的价格访问您可以从“Bill”类查询。少重复的变量。 –

回答

5

也许将此添加到您的Bill类?

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

这是用于保存,而不是用于默认值 – somenxavier

5

为什么你需要它是一个领域?您是否看到有人希望更改总价而不将价格和税率更改为相应价值的原因?如果它不是真的需要成为一个领域,那么你可以把它变成一种方法。

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

-2

@kichik回答如何显示使用模板标签的默认值,我建议实行由JavaScript自动计算。

当然,您将不得不验证用户输入或实施save()方法@Cris Curvey说。

+0

显示信息不是问题。 https://docs.djangoproject.com/en/2.0/ref/models/fields/#default这似乎是正确的答案。 – wm3ndez

相关问题