Как сделать запрос суммы с приведением типа и вычислением в представлениях Django? - PullRequest
0 голосов
/ 18 мая 2019

Я рассчитываю стоимость проданных предметов в представлениях django и в сигналах django и хочу рассчитать стоимость проданных предметов на лету.Поля цены и количества являются целыми числами.Как я могу преобразовать один из них в число с плавающей точкой и выполнить запрос суммы с помощью некоторых вычислений, подобных приведенным ниже SQL-запросам?

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

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

РЕДАКТИРОВАТЬ: Конечно, ожидаемые результаты - это наборы запросов django

Я ожидал вывода первого запроса

             cost
-----------------
5732594.000000002

и ожидал вывода второго запроса

 id    price  quantity    cost
------------------------------
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) as cost '
    'FROM public."sold" t'
)
вместо питонического

1 Ответ

0 голосов
/ 18 мая 2019

Вам нужно взглянуть на пару вещей, чтобы сделать это. Первым будет агрегация и аннотация. Также вам нужно изучить функции 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...