Django注释其他类

时间:2018-02-10 12:03:25

标签: python django python-3.x django-2.0

我是Django的新手。我试图显示总和。

enter image description here

投资组合模型:

# Create your models here.
class Portfolio(models.Model):
    name = models.CharField(max_length=255)
    user = models.ForeignKey(User, related_name='portfolios', on_delete=models.PROTECT)

    def get_absolute_url(self):
        return reverse('portfolio:detail',kwargs={'pk': self.pk})

    def __str__(self):
        return self.name

class PortfolioItem(models.Model):
    portfolio = models.ForeignKey(Portfolio, related_name='items', on_delete=models.CASCADE)
    trade = models.ForeignKey(Trade, on_delete=models.CASCADE)

贸易模式

# Create your models here.
class Trade(models.Model):
    quantity = models.FloatField()
    open_price = models.FloatField()
    commision = models.FloatField(null=True,blank=True)
    exchange_rate_usdsek = models.FloatField(null=True,blank=True)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    #portfolio = models.ForeignKey(Portfolio, related_name='trades', on_delete=models.PROTECT)
    open_date = models.DateTimeField(auto_now_add=True, null=True)

    def get_absolute_url(self):
        return reverse('trade:detail',kwargs={'pk': self.pk})

    def __str__(self):
        return self.stock.name

    @property
    def profit(self):
        #(sold - buy) / buy
        buy = self.open_price * self.quantity
        now = self.stock.current_price * self.quantity
        return ((now - buy ) / buy)*100

    def net_gain(self):
        #(sold - buy) / buy
        buy = self.open_price * self.quantity
        now = self.stock.current_price * self.quantity
        return now - buy

投资组合index.html

{% extends 'user/layout.html' %}
{% block body %}

{% for portfolio in all_portfolios %}
<h3>{{portfolio.name}}</h3>
<p>Total: {{portfolio.total_amount}}</p>
<table class="table">
    <thead>
        <tr>
            <th>Stock</th>
            <th>Amount</th>
            <th>Open Price</th>
            <th>Net P/L %</th>
            <th>Net P/L</th>
        </tr>
    </thead>

    {% for item in portfolio.items.all %}
    <tr>
        <td>{{item.trade.stock.name}}</td>
        <td>{{item.trade.quantity}}</td>
        <td>€{{item.trade.open_price}}</td>
        <td>€{{item.trade.stock.current_price}}</td>
        <td>{{item.trade.profit|floatformat:"0"}}%</td>
        <td>€{{item.trade.net_gain|floatformat:"2"}}</td>
    </tr>
    {% endfor %}    
</table>
{% endfor %}
{% endblock %}

投资组合视图

class IndexView(generic.ListView):
    template_name = 'portfolio/index.html'
    context_object_name = 'all_portfolios'
    # 
    def get_queryset(self):

        #portfolio = Portfolio.objects.all().prefetch_related('items').annotate(num_items=Count('items'))
        portfolio = Portfolio.objects.all().prefetch_related('items').annotate(total_amount = Count('items__trade'))
        return portfolio
        #return Order.objects.all().prefetch_related('items')

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        return context

我基本上想要在投资组合index.html上展示的是一组不同的股票。 所以有2行(Monero和Etherum)。每个都有支付总数和总价。我还想计算每枚硬币的净P / L.

我试过.annotate(total_amount = Count('items__trade__openm_price')) 计算总价但不起作用。我该怎么做?

另外,我是否需要PortfolioItem或者我可以在每笔交易中使用投资组合密钥吗?

1 个答案:

答案 0 :(得分:0)

您可以将项目组合在一起,例如:

Portfolio.objects.values('name').annotate(total_amount=Sum('trade__open_price'))

这将通过投资组合名称获得开盘价的总和。这是documentation

相关问题