簡體   English   中英

怎么寫提前Django ORM查詢

[英]How write advance Django ORM query

為了簡化,我們假設我有一個模型StockIOLog。

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

我得到以下queryset

pid  |   name  |  batch | stock
-----------------------------------
1    |   Napa  |  AB    | 85
-----------------------------------
1    |   Napa  |  AA    | 80
-----------------------------------
2    |   Amod  |  AA    | 40
-----------------------------------
2    |   Amod  |  CA    | 80

如何在django ORM中做類似的事情?

也許不是最好的答案,但您可以通過以下查詢在字典中purchasedconsumed

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())))
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM