【问题标题】:Django aggregate filtersDjango 聚合过滤器
【发布时间】:2017-03-09 12:06:15
【问题描述】:

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

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 模型可以根据收据的存在来查询一个条目是否是销售(库存也可以因为订单,或者被盗等而调整,我只对最近的销售感兴趣) .

我的查询现在看起来像这样,它目前只是获取最新的 ANY 库存条目。我想过滤注释以仅返回 InventoryEntry 上的接收__isnull=False 时创建的最大值:

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

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

【问题讨论】:

  • 我有一个使用 RawSQL 对象的解决方法,但如果我能提供帮助,我宁愿没有自己的 SQL。
  • 您实际上还没有发布您使用When的尝试
  • 我认为它不值得发布,因为它没有按预期工作。我希望有人知道如何获得我的问题所要求的内容,我发布不起作用的内容不会有太大帮助。如果您有想法,我很乐意尝试并发布结果。
  • filter(inventoryentry__receipt__isnull=False) 在filter(**item_qs_kwargs) 之后不起作用?

标签: python django


【解决方案1】:

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

【讨论】:

  • 我试试看告诉你
  • 很好的答案。只是一个简短的说明:没有F 表达式,它的工作原理相同。即:default='inventoryentry__created'。如果我遗漏了什么,请纠正我。
  • 这似乎按我的要求工作!谢谢!我会指出它的性能不是很好(尝试在此运行 .query,它并不理想!)和我正在使用的 rawsql 查询,虽然我认为 Django 可以轻松地重现它,但它不能,要好得多。我现在可能会坚持使用高性能的,然后再把它放在口袋里。
【解决方案2】:

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

from django.db.models import F

Item.objects\
.annotate(latest_inventoryentry_id=Max('inventoryentry__created'))\
.filter(
inventoryentry__id=F('latest_inventoryentry_id'), 
inventoryentry__receipt=None
)

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

谢谢

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2018-06-16
    • 2018-04-18
    • 1970-01-01
    • 2012-07-24
    • 2011-08-19
    • 2016-08-13
    • 2014-12-17
    • 2015-09-17
    相关资源
    最近更新 更多