我无法找到所购买股票的金额和平均值,我的代码如下 models.py
class Stock(models.Model):
name = models.CharField(verbose_name='Name of Stock', max_length=300)
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
slug = models.SlugField(unique=True)
purchase_price = models.DecimalField(verbose_name='Purchase Day Price', blank=True, null=True, max_digits=30, decimal_places=2)
pre_price = models.DecimalField(verbose_name='Last Day Price', blank=True, null=True, max_digits=30, decimal_places=2)
current_price = models.DecimalField(verbose_name='Current Price', blank=True, null=True, max_digits=30, decimal_places=2)
class BuyStock(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
stock = models.ForeignKey(Stock, verbose_name='Search')
quantity = models.IntegerField(verbose_name='Quantity Required',default=0)
timestamp = models.DateTimeField(auto_now=True, auto_now_add=False)
views.py
def stock_bought(request):
queryset = BuyStock.objects.filter(user=request.user)
context = {'queryset': queryset}
return render(request, 'stock/stock_bought_list.html', context)
stock_bought_list.html
{% for item in queryset %}
<tr>
<td>
<a href="{{ item.get_absolute_url }}">{{ item.stock.name }}</a>
</td>
<td>
{{ item.purchase_price }}
</td>
<td>
{{ item.quantity }}
</td>
</tr>
{% endfor %}
现在,如果用户多次购买相同的库存,列表也会分别显示很多次,但我希望它作为单个项目(基于名称)和数量和平均价格的总和,希望有人可以帮助我谢谢你。
答案 0 :(得分:0)
您需要将购买价格添加到BuyStock模型中。
然后得到平均价格:
queryset = (Stock
.objects
.filter(user=request.user)
.exclude(buystock__quantity=0)
.annotate(ave_price=Sum(F('buystock__quantity')*F(buystock__purchase_price'))/Sum(F('buystock__quantity'))))
这会为每个Stock实例添加一个属性ave_price。
我没有对此进行测试,但应该向您展示这个概念。
同时从BuyStock删除用户
答案 1 :(得分:0)
基于上面的答案,我总结如下。
qs = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(stock_name=Upper('stock__name')).distinct()
qs1 = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(ave_price=Avg('stock__purchase_price'))
qs2 = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(total_sum=Sum('quantity'))
然后将其合并到模板中。