art*_*t06 6 django listview django-annotate
我有以下两种型号.
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')
Run Code Online (Sandbox Code Playgroud)
和
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)
Run Code Online (Sandbox Code Playgroud)
我需要列出所有产品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
这是我到目前为止所取得的成就.
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'))
Run Code Online (Sandbox Code Playgroud)
我需要得到
stock_in_sum 作为 sum(quantity) where ttype='I' stock_out_sum 作为 sum(quantity) where ttype='O'blance_stock 如 product.opening_stock + stock_in_sum - stock_out_sum以及每个Product对象.
我该如何实现这一目标?
谢谢.
您可以使用条件聚合
queryset = queryset.annotate(
stock_in_sum = Sum(Case(When(stock__ttype='I', then=F('stock__quantity')), output_field=DecimalField(), default=0)),
stock_out_sum = Sum(Case(When(stock__ttype='O', then=F('stock__quantity')), output_field=DecimalField(), default=0)))
)
Run Code Online (Sandbox Code Playgroud)
为了得到总和,之后用F()表达式计算余额
queryset = queryset.annotate(balance_stock=F('opening_stock') + F('stock_in_sum') - F('stock_out_sum'))
Run Code Online (Sandbox Code Playgroud)
您还可以链接不同的操作而不是多个分配:
queryset = queryset.prefetch_related(...).annotate(...).annotate(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3527 次 |
| 最近记录: |