繁体   English   中英

根据相关字段最早实例的值过滤Django查询集

[英]Filter Django query set on value of earliest instance of related field

给定以下模型

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编写和查询后的内存中处理)来获取Thing的查询集,其最新时间戳的值为bar

换句话说,我想重新编写以下代码,并为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)

查看子查询文档, 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")

尽管我现在无法验证。 无论如何,一个非常有趣的问题,直到现在我才意识到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM