Я пытаюсь подсчитать акции, оставшиеся в портфеле пользователя 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})
Код: Выделить всё
{% for portfolio in portfolios %}
Owner: {{ portfolio.owner.get_full_name }}
Equit{{ portfolio.equity_count|pluralize:'y,ies' }}: {{ portfolio.equity_count }}
{% endfor %}
Покупка; 5x ААПЛ; 1 января 2024 г.; 300,00 долларов США
Продать; 5x ААПЛ; 15 января 2024 г.; 350 долларов США
Купить; 1x АА; 20 января 2024 г.; $200,00
Выход должен быть «Капитал: 1», где я получаю «Акции: 3», что означает общую сумму транзакций, а не количество акций, оставшихся в портфеле.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ransaction