如何编写高级Django ORM查询

2024-04-24 18:43:00 发布

您现在位置:Python中文网/ 问答频道 /正文

为了简化事情,假设我有一个模型StockIOLog。在

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

它包含以下数据:

^{pr2}$

类型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中做类似的事情?


Tags: namein产品modelsastypestockbatch
1条回答
网友
1楼 · 发布于 2024-04-24 18:43:00

也许不是最好的答案,但是您可以通过以下查询在字典中得到purchased和{}

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

相关问题 更多 >