Как подсчитать количество акций в портфеле на основе кредитных/дебетовых транзакций в Django?

Прошу прощения, если это ужасная статья, так как это мой первый вопрос.

Я пытаюсь подсчитать количество акций, оставшихся в портфеле Django пользователя после того, как в этом портфеле было совершено множество операций с акциями. Ниже приводится краткое описание моих моделей и моих попыток. В настоящее время я фильтрую портфели, в которых есть акции, но подсчитываю все транзакции в рамках этого портфеля.

модели

Class Portfolio(models.Model):
    name = models.CharField(...)
    owner = models.ForeignKey(User, ...)
    equity = models.ManytoManyField(Equity...., through="PortfolioEquity")

Class Equity(models.Model):
    symbol = models.CharField(...)
    name = models.CharField(...)

Class PortfolioEquity(models.Model):
    BUY = "BUY"
    SELL = "SELL"
    TRANSACTION_CHOICES = {
        BUY: "Buy",
        SELL: "Sell",
    }
    portfolio = models.ForeignKey(Portfolio, ...)
    equity = models.ForeignKey(Equity, ...)
    transaction = models.CharField(max_length=4, choices=TRANSACTION_CHOICES)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    shares = models.DecimalField(max_digits=8, decimal_places=3)
    date = models.DateField()

Просмотров

def get(self, request):
    positive_equities = PortfolioEquity.objects.values('equity').annotate(
        tot_shares=Sum(Case(
            When(transaction="BUY", then=F('shares')),
            When(transaction="SELL", then=-F('shares')),
            default=Value(0),
            output_field=DecimalField()
    ))).filter(shares__gt=0)

    portfolios = Portfolio.objects.annotate(equity_count=Subquery(
        positive_equities.filter(portfolio=OuterRef('pk'))
        .values('portfolio')
        .annotate(count=Count('equity'))
        .values('count')
    )).filter(equity_count__gt=0)

    return self.render_to_response({'portfolios': portfolios})    

html

{% for portfolio in portfolios %}    
    <p>
        Owner: {{ portfolio.owner.get_full_name }}
        Equit{{ portfolio.equity_count|pluralize:'y,ies' }}: {{ portfolio.equity_count }}
    </p>
{% endfor %}

Сделки:

Покупать; 5x AAPL; 1 января 2024; $300.00

Продать; 5x AAPL; 15 января 2024; $350.00

Купить; 1x AA; 20 января 2024; $200.00

Вывод должен быть 'Equity: 1', а я получаю 'Equities: 3», что является общей суммой транзакций, а не количеством акций, оставшихся в портфеле.

Думаю, вы хотите посчитать отношения manytomany.

# template
{{portfolio.equity.count}}
or
{{portfolio.equity.all|length}}


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