在 django 聚合中使用 ifnull default
Use ifnull default in django aggregation
我有以下型号类:
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 摘要的 Goods。
我尝试过的:
首先,我使用 annotate
将摘要添加到查询集中:
qs = Goods.objects.annotate(
qty_in=Sum(in_records__quantity),
qty_out=Sum(out_records_quantity)
)
这似乎可行,但有一个问题,当某些商品没有相关 in_records 或 out_records 时,注释的字段 returns None.
问题: 那么,在这种情况下,我有没有办法设置一个默认值,就像 sql 中的 ifnull(max(inreocrd.quantity), 0)
* 调用一样?
在此之后,我想在该 QuerySet 上添加一个过滤器:
我试过了:
qs = qs.filter(qty_in__gt(F(qty_out)))
但是如果商品没有记录,还是不行。
请帮忙。
您可以使用 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))
)
我有以下型号类:
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 摘要的 Goods。
我尝试过的:
首先,我使用 annotate
将摘要添加到查询集中:
qs = Goods.objects.annotate(
qty_in=Sum(in_records__quantity),
qty_out=Sum(out_records_quantity)
)
这似乎可行,但有一个问题,当某些商品没有相关 in_records 或 out_records 时,注释的字段 returns None.
问题: 那么,在这种情况下,我有没有办法设置一个默认值,就像 sql 中的 ifnull(max(inreocrd.quantity), 0)
* 调用一样?
在此之后,我想在该 QuerySet 上添加一个过滤器:
我试过了:
qs = qs.filter(qty_in__gt(F(qty_out)))
但是如果商品没有记录,还是不行。
请帮忙。
您可以使用 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))
)