【问题标题】:Django queryset sum and average valuesDjango 查询集总和和平均值
【发布时间】:2017-02-07 14:57:07
【问题描述】:

我很难找到所购买股票的总和和平均价值,我的代码如下 模型.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 %}

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

【问题讨论】:

标签: django


【解决方案1】:

根据上面的回答,我总结如下。

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

然后将其合并到模板中。

【讨论】:

    【解决方案2】:

    您需要将购买价格添加到 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 中删除用户

    【讨论】:

    • 所有者正在创建库存实例,因此他决定购买价格,这就是我放入库存模型的原因。我想要的是,如果买家多次购买相同的库存,它应该显示为具有总数量和平均价格的单个项目。现在所有购买实例都单独显示了。
    • @RodrigoEspinoza 添加了排除过滤器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2020-11-03
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多