이렇게하려면 장고에 '공식적인'메커니즘이 없습니다. 최근에 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
속성이 이 유스 케이스에 대한 해결책이지만, 여전히 로컬 변경 사항에 대한 정답이 맞지 않습니다.
'balance'는 현재 주식을 표시하고,'stock_in [out | out]'은 들어오고 나가는 항목의 합계를 표시해야합니까? 그런 :'균형 == initial_balance + stock_in - stock_in' - stock_out'? – schwobaseggl