кто-нибудь сталкивался с таким?
Подробнее
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, логично, уже мозги кипят к ночи)
Ага, мои тоже булькают)
Обсуждают сегодня