I have the following two models.
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')
and
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)
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'))
I need to get
stock_in_sum
as thesum(quantity) where ttype='I'
stock_out_sum
as thesum(quantity) where ttype='O'
blance_stock
asproduct.opening_stock + stock_in_sum - stock_out_sum
along with each Product object.
How do I achieve this?
Thanks.
You could use conditional aggregation
To make the sums, and after that compute the balance with F() expression
You can also chain the different operation instead of multiple assignations: