Django聚合过滤器

时间:2016-10-26 23:45:08

标签: python django

我有3个类似下面的模型,我试图在一个查询中获取我的项目的最新销售日期,这绝对可以使用SQL,但我试图使用内置的Django功能:< / p>

class Item(models.Model):
    name = models.CharField()
    ...

class InventoryEntry(models.Model):
    delta = models.IntegerField()
    item = models.ForeignKey("Item")
    receipt = models.ForeignKey("Receipt", null=True)
    created = models.DateTimeField(default=timezone.now)
    ...

class Receipt(models.Model):
    amt = models.IntegerField()
    ...

我要做的是查询我的商品并注释上次销售时的商品。 InventoryEntry模型可以根据收据的存在来查询条目是否是销售(库存也可以因订单调整或被盗等,我只对最近的销售感兴趣)

我的查询现在看起来像这样,目前只获取最新的任何库存条目。我想过滤注释,只返回在inventoryEntry上的receipt__isnull = False时创建的最大值:

Item.objects.filter(**item_qs_kwargs).annotate(latest_sale_date=Max('inventoryentry_set__created'))

我试图使用When查询表达式,但它没有按预期工作,所以也许我误用了它。任何见解都将不胜感激

2 个答案:

答案 0 :(得分:3)

conditional expressions的解决方案应该是这样的:

from django.db.models import Max, Case, When, F

sale_date = Case(When(
    inventoryentry__receipt=None,
    then=None
), default=F('inventoryentry__created'))
qs = Item.objects.annotate(latest_sale_date=Max(sale_date))

答案 1 :(得分:0)

我尝试了一些修改过的解决方案。看看。

System.getProperty("line.separator");

我没有手动检查。你可以检查并告诉我。

由于