【问题标题】:Is it poostible to convert a python method to djagno database method?是否可以将 python 方法转换为 django 数据库方法?
【发布时间】:2021-12-08 03:58:36
【问题描述】:

我想按总价值对我的查询进行排序,总价值是项目的外键 我使用下面的方法来计算总量。

models.py 函数

    def total(self):
        total=0
        for item in self.items.all():
            if item.taxed==True:
                total = total + item.amount + (item.amount*(self.tax)/(100))
            else:
                total = total + item.amount
        return total

我的查询看起来像:

nvoices = Invoices.objects.all().order_by()

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    您不能传递自定义函数来订购对象。那是因为order_by()实际上是由无法运行Python代码的数据库执行的。

    但是看看你的total() 函数,在我看来它主要是一个聚合函数,我认为你实际上可以通过使用自定义聚合函数得到你想要的,你必须用 SQL 编写详细的here .

    这是一个使用标准 SQL 函数 SUM 的示例:

    from django.db.models import Sum
    Invoice.objects.annotate(total=Sum('item__amount')).all().order_by('-total')
    

    这应该返回所有带有附加字段totalInvoice 对象,并按该字段降序排列。

    您现在可以将Sum() 替换为您的自定义函数。 Here's an article 详细说明如何编写这样的函数。

    【讨论】:

    • 这可以通过 Case 函数来完成...
    • 我也在考虑这个问题,但我不知道怎么做。 CASE 语句将包含单个项目 (CASE WHEN item.taxed THEN … ELSE … END)。因此我认为case语句需要成为聚合函数的一部分?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多