django-annotate()-在另一列上具有过滤器的列的Sum() [英] django - annotate() - Sum() of a column with filter on another column

查看:439
本文介绍了django-annotate()-在另一列上具有过滤器的列的Sum()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下两种型号.

class Product(models.Model):
    product_group=models.ForeignKey('productgroup.ProductGroup', null=False,blank=False)
    manufacturer=models.ForeignKey(Manufacturer, null=False,blank=False)
    opening_stock=models.PositiveIntegerField(default=0)

    class Meta:
        unique_together = ('product_group', 'manufacturer')

TRANSACTION_TYPE=(('I','Stock In'),('O','Stock Out'))
class Stock(models.Model):
    product=models.ForeignKey('product.Product', blank=False,null=False)
    date=models.DateField(blank=False, null=False,)
    quantity=models.PositiveIntegerField(blank=False, null=False)
    ttype=models.CharField(max_length=1,verbose_name="Transaction type",choices=TRANSACTION_TYPE, blank=False)

我需要列出所有带有stock_in_sum=Sum(of all stock ins)stock_out_sum=Sum(of all stock outs)blance_stock=opening_stock+stock_in_sum - stock_out_sum

I need to list all products with stock_in_sum=Sum(of all stock ins) , stock_out_sum=Sum(of all stock outs) and blance_stock=opening_stock+stock_in_sum - stock_out_sum

这是我到目前为止所取得的成就.

This is what I've achieved so far.

class ProductList(ListView):
    model=Product

    def get_queryset(self):
        queryset = super(ProductList, self).get_queryset()
        queryset = queryset.prefetch_related('product_group','product_group__category','manufacturer')
        queryset = queryset.annotate(stock_in_sum = Sum('stock__quantity'))
        queryset = queryset.annotate(stock_out_sum = Sum('stock__quantity'))

我需要获得

  1. stock_in_sum作为sum(quantity) where ttype='I'
  2. stock_out_sum作为sum(quantity) where ttype='O'
  3. blance_stock作为product.opening_stock + stock_in_sum - stock_out_sum
  1. stock_in_sum as the sum(quantity) where ttype='I'
  2. stock_out_sum as the sum(quantity) where ttype='O'
  3. blance_stock as product.opening_stock + stock_in_sum - stock_out_sum

以及每个产品对象.

我该如何实现?

谢谢.

推荐答案

您可以使用要求和,然后用 F()表达式

queryset = queryset.annotate(balance_stock=F('opening_stock') + F('stock_in_sum') - F('stock_out_sum'))

您还可以链接不同的操作而不是多个分配:

You can also chain the different operation instead of multiple assignations:

queryset = queryset.prefetch_related(...).annotate(...).annotate(...)

这篇关于django-annotate()-在另一列上具有过滤器的列的Sum()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆