2017-12-28 9 views
1

에 models.py 두 모델 필드를 추가하는 방법은파이썬 - 장고

class Inventory(models.Model): 
    date = models.DateField(("Date"), default=datetime.now) 
    product = models.ForeignKey(Product) 
    stock_in = models.IntegerField() 
    stock_out = models.IntegerField() 
    balance = models.IntegerField() 
    particulars = models.CharField(max_length=250) 

가 지금은 균형에 일부 주식을 추가 할 내 models.py에서 클래스가 있습니다. stock_in 값을 사용하여 Inventory 클래스의 특정 제품 잔액에 특정 숫자를 추가합니다. UpdateView를 사용하여 stock_in 필드를 업데이트하고 그 값을 저울에 추가 할 수 있습니다.

저는 현재 이것을 사용하고 있습니다. 저는 인터넷에서 몇 가지 해결책을 시도했지만 아무 소용이 없습니다.

@property 
    def total(self): 
     return self.stock_in + self.balance 
+0

'balance'는 현재 주식을 표시하고,'stock_in [out | out]'은 들어오고 나가는 항목의 합계를 표시해야합니까? 그런 :'균형 == initial_balance + stock_in - stock_in' - stock_out'? – schwobaseggl

답변

0

이렇게하려면 장고에 '공식적인'메커니즘이 없습니다. 최근에 Django 프레임 워크에 공식 솔루션을 추가하기위한 아이디어가 django-developers 메일 링리스트의 this thread에서 논의되었습니다. 그것은 현재 귀하의 경우에 가장 적합한 솔루션에 대한 영감으로 작용할 수 있습니다.

이 방법은 간단한 계산에 적합합니다. 속성 값이 더 많이 계산되면 값을 여러 번 사용하면 @cached_property을 사용하면 약간의 도움이됩니다.

또한 쿼리 세트에 주석을 추가하여이 값을 계산할 때 데이터베이스를 사용할 수 있습니다. 이 사용자 지정 관리자를 정의 할 필요 : 그들은 기본 관리자를 사용하여 입수해온 경우

class InventoryManager(models.Manager): 
    def get_queryset(self): 
     super().get_queryset().annotate(total=F('stock_in') + F('balance')) 

class Inventory(models.Model): 
    date = models.DateField(("Date"), default=datetime.now) 
    product = models.ForeignKey(Product) 
    stock_in = models.IntegerField() 
    stock_out = models.IntegerField() 
    balance = models.IntegerField() 
    particulars = models.CharField(max_length=250) 

    objects = InventoryManager() 

이것은 당신의 Inventory 모델 인스턴스에 balance 속성을 추가합니다.

링크 된 django-developers 스레드에서 논의 된 것과 같은이 접근법의 문제점은 모달이 로컬로 변경 될 때 예상되는 것입니다. 예를 들어

, 내가 모달 대한 stock_in을 변경한다면 장소에 사용자 지정 관리자와, total의 값이 여전히 데이터베이스에서 검색시 stock_in의 가치에 대해 유효합니다 :

>> inventory = Inventory(stock_in=20, balance=10) 
>> inventory.total 
AttributeError: 'Inventory' object has no attribute 'total' 

이 ㄱ 수도 클래스에 __getattr__ 방법을 추가 : 또한

>> qs = Inventory.objects.filter(date__gte=date(2017, 12, 22)) 
>> inventory0 = qs[0] 
>> print(inventory0.total, inventory0.stock_in, inventory.balance) 
100, 50, 50 
>> inventory.balance = 100 
>> print(inventory0.total, inventory0.stock_in, inventory.balance) 
100, 50, 100 

의 DB에서 가져온 아닌 모델 인스턴스는 모든 실 거예요 total 속성이 이 유스 케이스에 대한 해결책이지만, 여전히 로컬 변경 사항에 대한 정답이 맞지 않습니다.