我的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)
现在我想在余额中添加一些股票。使用stock_in值将某些数字添加到Inventory类中特定产品的余额中。使用UpdateView,以便我可以更新stock_in字段,然后将该值添加到余额中。
我目前正在使用此功能,我已在互联网上尝试了几种解决方案,但无济于事。
@property
def total(self):
return self.stock_in + self.balance
答案 0 :(得分:0)
没有'官方' Django中的机制来做到这一点。最近,在django-developers邮件列表的this thread中讨论了为Django框架添加一些官方解决方案的一些想法。它可能是目前最适合您案例的解决方案的灵感来源。
您的方法适用于简单的计算。如果属性的计算成本更高,如果多次使用该值,使用@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()
如果使用默认管理器对其进行了检索,则会为balance
模型实例添加Inventory
属性。
这种方法的问题(就像链接的django-developers线程中讨论的那样)是你在本地更改模态时的期望。
例如,在使用自定义管理器的情况下,如果我要为模式更改stock_in
,则total
的值对于stock_in
的值仍然有效从数据库中检索它的时间:
>> 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
属性:
>> inventory = Inventory(stock_in=20, balance=10)
>> inventory.total
AttributeError: 'Inventory' object has no attribute 'total'
向您的类添加__getattr__
方法可能是此用例的解决方案,但仍会因本地更改而导致错误答案。