python Django并在QuerySet中使用计算值

hmae6n7t  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(132)

我有一个函数可以将净价转换为总价,如下所示。taxRate是税值。例如23,8,5,0

def gross(netValue, taxRate: int, currencyPrecision=2):
    if taxRate > 0:
        return round(netValue * (100 + taxRate) / 100, currencyPrecision)
    else:
        return round(netValue, currencyPrecision)

在我的模型中,我有一个类,它是带有字段的订单项:净价格和税收ID。

class OrderPosition(models.Model):
    posNumber = models.AutoField(auto_created=True, primary_key=True, editable=False, blank=False)
    order = models.ForeignKey(OrderHeader, on_delete=models.PROTECT)
    product = models.ForeignKey(Product, on_delete=models.PROTECT)
    quantity = models.DecimalField(blank=False, max_digits=3, decimal_places=0)
    netPrice = MoneyField(blank=False, max_digits=6, decimal_places=2, default=Money("0", "PLN"))
    taxId = models.IntegerField(blank=False, default=0)

具有给定ID的整个订单的价值可以计算如下:

def getNetValue(self):
        posList = OrderPosition.objects.filter(order_id=self.orderID)
        if posList:
            return str(posList.aggregate(netValue=Sum(F('quantity') * F('netPrice'),
                                                      output_field=MoneyField()))['netValue'])
        else:
            return "0"

问:我可以在查询中使用函数“gross()”来计算订单的总值吗?计算方法与计算净值类似。
我假设聚合函数是在数据库端执行的(在我的例子中是mySQL),并且我们只能使用在数据库和SQL级别可以理解的内容。

wgmfuz8q

wgmfuz8q1#

试试这个:

net_value = OrderPosition.objects.filter(order_id=self.order_id).aggregate(
    net_value=Sum(F('quantity') * F('net_price'), output_field=MoneyField())
)['net_value']

tax_rate = OrderPosition.objects.filter(order_id=self.orderID) \
    .values('taxId')[0]['taxId']

gross_value = gross(net_value, tax_rate)

相关问题