首页 > 解决方案 > 如何在 django 视图中使用类型转换和计算进行求和查询?

问题描述

我正在计算 django 视图和 django 信号中的已售商品成本,我想即时计算已售商品的成本。价格和数量字段是整数。如何将其中一个转换为浮点数并使用以下这些 sql 查询等计算进行求和查询?

SELECT sum((t.price::FLOAT * t.quantity) / 1000) as cost FROM public."sold" t;

选择
t.id, t.price, t.quantity, sum((price::FLOAT * quantity) / 1000) 作为成本
来自公众。“出售”t
按 t.id 分组;

编辑:当然预期的结果是 django 的查询集

我期望第一个查询的输出

             成本
-----------------
5732594.000000002

我期望第二个查询的输出

id 价格 数量 成本
------------------------------
846 1100 5000 5500
790 1500 1000 1500
828 2600 1000 2600
938 1000 5000 5000
753 1500 2000 3000
652 5000 1520 7600

编辑2:我通过raw()像这样的方法解决了这个问题

MyModel.objects.raw(
    'SELECT sum((t.price::FLOAT * t.quantity) / 1000) 作为成本'
    '来自公众。“出售” t'
)
而不是pythonic方式

标签: djangodjango-viewsdjango-signals

解决方案


您需要查看几件事才能做到这一点。第一个是聚合和注释。此外,您还需要查看 Cast 和 F 函数。请查看以下链接:

https://docs.djangoproject.com/en/2.2/topics/db/aggregation/

https://docs.djangoproject.com/en/2.2/ref/models/database-functions/#cast

https://docs.djangoproject.com/en/2.2/ref/models/expressions/

免责声明:这是一个示例,可能不起作用

您的查询集将如下所示:

from django.db.models import FloatField, Sum
from django.db.models.functions import Cast

qs = MyModel.objects.annotate(cost=Sum(F(Cast('price', FloatField())) * F('quantity') / 1000))

推荐阅读