Python - 如何在Django中的models.py中添加两个模型字段

时间:2017-12-28 17:38:26

标签: python django

我的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

1 个答案:

答案 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__方法可能是此用例的解决方案,但仍会因本地更改而导致错误答案。