1
次の2つのモデルがあります。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
これは私がこれまで達成してきたものです。
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'))
私は、各製品のオブジェクトと一緒にproduct.opening_stock + stock_in_sum - stock_out_sum
としてsum(quantity) where ttype='O'
blance_stock
としてsum(quantity) where ttype='I'
stock_out_sum
として
stock_in_sum
を取得する必要があります。どうすればよいですか?
ありがとうございました。
ありがとう! ExpressionWrapper()を使用するように私に尋ねました。 'クエリセット= queryset.annotate( \t \t stock_in_sum =合計(ケース((stock__ttype = 'I' は、次に= ExpressionWrapper(F( 'stock__quantity')、 \t \t \t \t \t \t次のように最初の二つのデータを得\t \t \t \t \t \t \t \t出力フィールド= DecimalFieldは())))) \t \t) \t \t \t \t \t \t queryset = queryset。( \t \t stock_out_sum =合計(ケース((stock__ttype = 'O' は、= ExpressionWrapper(F( 'stock__quantity')、 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \tに注釈を付けます\t output_field = DecimalField()))))) \t \t \t \t – art06
しかし 'クエリセット= queryset.annotate( \t \t balance_stock = ExpressionWrapper(F( 'opening_stock')+ F( 'stock_in_sum') - F( 'stock_out_sum')、出力フィールド= DecimalFieldは()) \t \tは)' Noneを与えません'stock_in_sum'または' stock_out_sum'のいずれかを持つすべての行がNoneです。 – art06
私はどこかでNoneの代わりに0を返す必要があるように見えますが、方法はわかりません。 – art06