Как подсчитать количество акций в портфеле на основе кредитных/дебетовых транзакций в 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}}