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

왜 필드가 필요합니까? 가격과 세금을 해당 가치로 변경하지 않고 누군가가 총 가격을 변경하기를 원하는 이유가 있습니까? 실제로 필드가 될 필요가 없다면, 그냥 필드로 만들 수 있습니다.

{{ 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 템플릿 태그를 사용하여 기본 값을 표시하는 방법을 대답보고, 나는 자바 스크립트에 의해 자동 계산을 구현하는 것이 좋습니다하십시오.

물론 @Chris Curvey와 마찬가지로 사용자 입력을 확인하거나 save() 메서드를 구현해야합니다.

+0

정보를 표시하는 것은 문제가 아닙니다. https://docs.djangoproject.com/en/2.0/ref/models/fields/#default 이것은 올바른 대답 인 것 같습니다. – wm3ndez