2

単純化するために、モデルStockIOLogがあるとします。Django ORMクエリーの書き方

class StockIOLog(models.Model): 
    pid = models.IntegerField() 
    name= models.CharField(max_length=50) 
    type= models.IntegerField() 
    stock = models.IntegerField() 

それはデータ次のものが含まれます。

pid | name | batch | type | quantity 
------------------------------------------------ 
1 | Napa | AB | 0  | 100 
------------------------------------------------ 
1 | Napa | AA | 0  | 100 
------------------------------------------------ 
2 | Amod | AA | 0  | 100 
------------------------------------------------ 
2 | Amod | CA | 0  | 100 
------------------------------------------------ 
1 | Napa | AB | 1  | 10 
------------------------------------------------ 
1 | Napa | AB | 1  | 5 
------------------------------------------------ 
1 | Napa | AA | 1  | 20 
------------------------------------------------ 
2 | Amod | AA | 1  | 10 
------------------------------------------------ 
2 | Amod | AA | 1  | 50 
------------------------------------------------ 
2 | Amod | CA | 1  | 5 
------------------------------------------------ 
2 | Amod | CA | 1  | 15 

タイプ0は、製品を購入されたことを意味し、タイプ1は、今、私はすべての製品のバッチ式の総株式を計算したい、製品が消費されたことを意味します。

次のSQLクエリ

SELECT pid, name, batch, SUM(in) - SUM(out) as stock FROM (
    SELECT pid, name, type SUM(quantity) as in, 0 as out from `qset` WHERE type=0 GROUP BY pid,type,batch as a 
    UNION 
    SELECT pid, name, type 0 as in, SUM(quantity) as out from `qset` WHERE type=1 GROUP BY pid,type,batch as b 
) ac table_a 

を実行することにより、私は、クエリセット

DjangoのORMで同様のことを行う方法
pid | name | batch | stock 
----------------------------------- 
1 | Napa | AB | 85 
----------------------------------- 
1 | Napa | AA | 80 
----------------------------------- 
2 | Amod | AA | 40 
----------------------------------- 
2 | Amod | CA | 80 

を次のですか?

+0

に従うことによって、辞書にpurchasedconsumedを得ることができます。あなたはシナリオを説明できますか? –

+0

@ Md.Al-Amin質問をもっと簡単に更新しました –

答えて

0
たぶん

ない最良の答えが、あなたはそれがSQLクエリからの質問を理解するのは難しいクエリ

from django.db.models import When, F, IntegerField, Sum, Count 
from .models import StockIOLog 

values = (StockIOLog.objects.all().values("pid", "name", "batch").annotate(
    purchased=Sum(Case(When(type=1, then=F("stock")), 
         output_filed=IntegerField())), 
    consumed=Sum(Case(When(type=0, then=F("stock")), 
         output_field=IntegerField()))) 
) 
関連する問題