170 похожих чатов

Всем привет! Не могу заюзать When(Case) с many-to-many в ORM, может

кто-нибудь сталкивался с таким?

17 ответов

18 просмотров

Подробнее

Данила- Автор вопроса

Sum(Case(When(items__type='1', then=-F('items__amount')), default=F('items__amount'))) Например такое

Я првильно понимаю есть какая-то модель A и есть Item с fk на A. И нужно посчитать сумму с учётом если type=1, то вычесть, иначе сложить?

Данила- Автор вопроса

Да

Данила- Автор вопроса

Мне выдает django.core.exceptions.FieldError: Cannot resolve keyword 'items' into field.

Есть решение с Subquery + Case When. Сейчас напишу

Так, я вот какой способ нашёл A.objects.annotate( positive=Sum('items__amount', filter=Q(items__type='1')), negative=Sum('items__amount', filter=~Q(items__type='1')), sum=F('positive')-F('negative') ) Или хочется с Case When?)

Данила- Автор вопроса

Хотелось бы с Case When, там много условий)

Без волшебства не получится. Толкьо волшебство спасёт мир. Сейчас поищу

Данила- Автор вопроса

😂

В общем начнем с такого, снначала сделать надо кастомный класс для сабквери class SumSubquery(Subquery): def __init__(self, queryset, sum_field, output_field=None, **extra): extra.update(sum_field=sum_field) super().__init__(queryset, output_field, **extra) template = '(SELECT SUM(%(sum_field)s) FROM (%(subquery)s) _sum)' Далее создаётся кверисет для субквери item_queryset = ( Item.objects.filter(a_pk=OuterRef('pk')) .annotate( _amount=Case( When(type='1', then=0 - F('amount')), default=F('amount') ) ) .values('_amount') ) и вычисляем A.objects.annotate( sum=SumSubquery( item_queryset, sum_field='total_sum', output_field=models.IntegerField() ) )

Надеюсь код выше работает)

Данила- Автор вопроса

Попробую)

Данила- Автор вопроса

django.db.utils.ProgrammingError: column "total_sum" does not exist )

должно быть _amount)

Данила- Автор вопроса

Вроде бы работает, спасибо А то что должно быть _amount, логично, уже мозги кипят к ночи)

Ага, мои тоже булькают)

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта