Как вычесть аннотированные значения в django?

Я не могу вычесть аннотированные значения двух разных запросов в представлениях django.

Я пробовал это:

    qs = Stockdata.objects.filter(User=self.request.user, Company=company_details.pk, Date__gte=selectdatefield_details.Start_Date, Date__lte=selectdatefield_details.End_Date)
    total = qs.annotate(the_sum=Coalesce(Sum('salestock__Quantity'),0)).values('the_sum')
    total2 = qs.annotate(the_sum2=Coalesce(Sum('purchasestock__Quantity_p'),0)).values('the_sum2')
    totalqty = total2 - total

Я попытался использовать Coalesce из django.db.models.function, но получил эту ошибку

TypeError: unsupported operand type(s) for -: 'QuerySet' and 'QuerySet'

Есть ли в django какая-нибудь функция для вычитания значений?

Кто-нибудь знает, что я делаю не так в своем коде?

Не могли бы вы разместить свои модели?

art 05.12.2018 15:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 953
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно использовать совокупность:

total = qs.aggregate(the_sum=Coalesce(Sum('salestock__Quantity'),0))
total2 = qs.aggregate(the_sum2=Coalesce(Sum('purchasestock__Quantity_p'),0))

totalqty = total2['the_sum2'] - total['the_sum']

Я хочу найти общее количество для каждого экземпляра запаса, но агрегат даст мне значение общего количества для всех запасов ...

Niladry Kar 05.12.2018 15:13
Ответ принят как подходящий

Пытаться

qs = qs.annotate(
    sales_sum = Coalesce(Sum('salestock__Quantity'),0),
    purchase_sum = Coalesce(Sum('purchasestock__Quantity_p'),0)
)
qs = qs.annotate(
    difference = ExpressionWrapper(F('sales_sum') - F('purchase_sum'), output_field=DecimalField())
) 

Теперь он выдает мне эту ошибку: «TypeError: annotate () отсутствует 1 обязательный позиционный аргумент:« self »» ... Как это исправить?

Niladry Kar 06.12.2018 07:29

Извините, это qs.annotate, а не queryset.annotate. Исправил.

art 06.12.2018 07:55

Но он не возвращает никаких значений, он выглядит следующим образом: «<QuerySet [<Stockdata: Iphone>, <Stockdata: Samsung Galaxy>]>» ... «Iphone» и «Samsung Galaxy» - это некоторые записи, которые я поместил в свои Stockdata модель...

Niladry Kar 06.12.2018 08:03

В конце проверьте вывод print(qs.values()).

art 06.12.2018 08:04

Другие вопросы по теме