Django ORM - Annotate

G'day All,

Я пытаюсь создать текущий баланс всех отрицательных транзакций с датой меньше или равной дате транзакции текущего объекта транзакции, но если я использую __lte=transaction_date, я получаю несколько строк, хотя это правильно, я хочу суммировать эти несколько строк, как мне это сделать и сделать аннотацию к моему набору вопросов?

Текущая попытка:

        #getting transaction sum and negative balances to take away from running balance 
        totals = queryset.values('transaction_date','award_id','transaction').annotate(transaction_amount_sum=Sum("transaction_amount"))\
            .annotate(negative_balance=Coalesce(Sum("transaction_amount",filter=Q(transaction__in=[6,11,7,8,9,10,12,13])),0))\

        #adding it all to the queryset
        queryset = queryset\
            .annotate(transaction_amount_sum=SubquerySum(totals.filter(award_id=OuterRef('award_id'),transaction_date=OuterRef('transaction_date'),transaction=OuterRef('transaction'))\
            .values('transaction_amount_sum')))\
            .annotate(negative_balance=SubquerySum(
                totals.filter(award_id=OuterRef('award_id'),transaction_date=OuterRef('transaction_date'),transaction=OuterRef('transaction'))\
            .values('negative_balance')
            ))\
            .annotate(total_awarded=SubquerySum("award__total_awarded"))\
            .annotate(running_balance=F('total_awarded')-F('negative_balance')) #This doesnt work correct, we need transaction date to be less than or eqaul not just the transaction date.

        #filtering on distinct, we only want one of each record, doesnt matter which one. :)
        distinct_pk = queryset.distinct('transaction_date','award_id','transaction').values_list('pk',flat=True)
        queryset = queryset.filter(pk__in=distinct_pk)

Что нужно исправить:

.annotate(negative_balance=SubquerySum(
                totals.filter(award_id=OuterRef('award_id'),transaction_date=OuterRef('transaction_date'),transaction=OuterRef('transaction'))\
            .values('negative_balance')

На самом деле выше должно быть:

.annotate(negative_balance=SubquerySum(
                totals.filter(award_id=OuterRef('award_id'),transaction_date__lte=OuterRef('transaction_date'))\
            .values('negative_balance')

Если я сделаю это, то вернется несколько строк, и я хочу просуммировать эти строки по отрицательному_балансу.

Надеюсь, что все вышесказанное имеет смысл.

Любая помощь будет высоко оценена.

Спасибо, Томас Льюин

Вернуться на верх