基于Django模型内部方法的计算字段

时间:2019-05-14 17:23:29

标签: python django django-models

如何在我的PurchaseOrder模型中自动填充字段:

class PurchasedOrder(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField()


    @property
    def batch_cost(self):
        return self.quantity * self.product.unit_price

    def __str__(self):
        return self.product.name

如果我将其定义为属性,则将无法使用该属性进行过滤和填充。我希望它是一个计算字段。

我尝试了以下操作,但没有用:

def calculate_batch_cost(self):
    return self.quantity * self.product.unit_price

batch_cost = models.FloatField(default=calculate_batch_cost)

感谢您的帮助<3

2 个答案:

答案 0 :(得分:1)

您可以在categoryAxis.keepSelection = true; .annotate(..) [Django-doc],例如:

QuerySet

此查询集中的from django.db.models import F PurchasedOrder.objects.annotate( batch_cost=F('product__unit_price') * F('quantity') ).filter( batch_cost__gt=100 # An example of filtering )将具有属性PurchasedOrder,即产品的.batch_cost,乘以unit_price

然后我们可以例如对该过滤器进行过滤。例如,在上面的查询中,我们将获得quantity大于PurchasedOrder的所有batch_cost

答案 1 :(得分:1)

如果需要在创建或更新对象时指定此字段并进行更改,则可以将其添加到保存功能内:

def save(self, *args, **kwargs):
    self.batch_cost = self.calculate_batch_cost()
    super(PurchasedOrder, self).save(*args, **kwargs)

当然,您需要在模型内部添加字段

batch_cost = models.FloatField()

然后,您仍然可以在代码中的其他地方使用calculate_batch_cost函数。