2016-08-21 109 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