Django queryset总和和平均值

时间:2017-02-07 14:57:07

标签: django

我无法找到所购买股票的金额和平均值,我的代码如下 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 %}

现在,如果用户多次购买相同的库存,列表也会分别显示很多次,但我希望它作为单个项目(基于名称)和数量和平均价格的总和,希望有人可以帮助我谢谢你。

2 个答案:

答案 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'))

然后将其合并到模板中。