【问题标题】:Use ifnull default in django aggregation在 django 聚合中使用 ifnull 默认值
【发布时间】:2015-03-17 01:48:32
【问题描述】:

我有以下模型类:

class Goods(models.Model):
    name = models.CharField(max_length=100)

class InRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='in_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

class OutRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='out_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

所以,我想获得一个 QuerySet,其中包含所有具有正存储库的商品。

另一种描述方式,我想过滤 InRecord 数量汇总大于 OutRecord 汇总的商品。


我尝试过的:

首先,我使用annotate 将摘要添加到查询集中:

qs = Goods.objects.annotate(
        qty_in=Sum(in_records__quantity), 
        qty_out=Sum(out_records_quantity)
    )

这似乎可行,但有一个问题,当某些商品没有相关的in_records或out_records时,注释的字段返回None

问题:那么,在这种情况下,我有什么办法可以设置默认值,就像在 sql 中调用 ifnull(max(inreocrd.quantity), 0)* 一样?


在此之后,我想在该 QuerySet 上添加一个过滤器:

我试过了:

qs = qs.filter(qty_in__gt(F(qty_out)))

但是如果没有货物记录,它仍然不起作用。

请帮忙。

【问题讨论】:

    标签: django default aggregate models annotate


    【解决方案1】:

    您可以使用 Django 的 Coalesce 函数。这样的东西应该在 Django 1.8 或更高版本中工作:

    from django.db.models.functions import Coalesce
    
    qs = Goods.objects.annotate(
            qty_in=Sum(Coalesce(in_records__quantity, 0)),
            qty_out=Sum(Coalesce(out_records__quantity, 0))
        )
    

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 2018-06-22
      • 2020-09-27
      • 2020-07-28
      • 2012-01-15
      • 2017-06-06
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多