【问题标题】:Filter Django query set on value of earliest instance of related field根据相关字段的最早实例的值过滤 Django 查询集
【发布时间】:2019-02-04 13:42:43
【问题描述】:

给定以下模型

class Thing(models.Model):
    ...

class Status(models.Model):
   thing = models.ForeignKey(Thing, ...)
   value = models.CharField(choices=(('foo', 'foo'), ('bar', 'bar')), ...)
   timestamp = models.DateTimeField(auto_now_add=True)

   class Meta:
      ordering = ('timestamp',)

是否有可能通过使用 Django ORM 工具(无需太多原始 SQL 编写和后查询内存处理)来获取最新时间戳值为 barThings 的查询集?

换句话说,我想重写下面的代码并为queryset实现相同的值:

thing_ids = []
for thing in Thing.objects.all():
    status = thing.status_set.last()
    if status is not None and status.value == 'bar':
        thing_ids.append(thing.id)

queryset = Thing.objects.filter(id__in=thing_ids)

【问题讨论】:

    标签: python django


    【解决方案1】:

    查看Subquery 文档、ORM cookbook 以及您的 if 条件,我认为您可以尝试以下操作:

    latest_status = Status.objects.filter(thing_id=OuterRef("pk")).order_by("-timestamp")
    queryset = Thing.objects.annotate(
        lastest_status=Subquery(latest_status.values("value")[:1])
    ).filter(latest_status="bar")
    

    虽然我现在无法验证这一点。无论如何,非常有趣的问题,直到现在我才知道这些。

    【讨论】:

    • 谢谢,这是一个很好的解决方案!我忘记了Subquery的存在@
    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 2023-01-16
    • 2017-07-30
    • 2015-09-06
    • 2020-12-19
    • 1970-01-01
    • 2012-12-03
    • 2013-06-11
    相关资源
    最近更新 更多