我有以下两个模型。
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=所有库存入库之和
,stock_out_sum=所有库存出库之和
,blance_stock=期初库存+stock_in_sum-stock_out_sum
这是我目前已经实现的。
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'))
我需要获取每个产品对象以及:
stock_in_sum
作为ttype='I'
的quantity
和的总和stock_out_sum
作为ttype='O'
的quantity
和的总和blance_stock
作为product.opening_stock + stock_in_sum - stock_out_sum
我应该如何实现?
谢谢。
queryset = queryset.annotate( stock_in_sum = Sum(Case(When(stock__ttype='I', then= ExpressionWrapper(F('stock__quantity'), output_field=DecimalField())))) ) queryset = queryset.annotate( stock_out_sum = Sum(Case(When(stock__ttype='O', then= ExpressionWrapper(F('stock__quantity'), output_field=DecimalField())))) )
- artqueryset = queryset.annotate( balance_stock = ExpressionWrapper(F('opening_stock') + F('stock_in_sum') - F('stock_out_sum'), output_field=DecimalField()) )
对于任何一行中的stock_in_sum
或stock_out_sum
为 None 的情况下都会返回 None。 - artNone
,而是添加0。 - Nadège