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

标签 python django

给定以下模型

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 的 s ?

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

最佳答案

查看 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")

虽然我现在无法验证这一点。不管怎样,这是一个非常有趣的问题,直到现在我才意识到这些。

关于python - 根据相关字段最早实例的值过滤 Django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54517419/

相关文章:

django - 为要在 Docker 容器中使用的 SSL 证书生成私钥

python - 我如何矢量化这个循环? (不是我如何进行one-hot编码)

python - 我可以简化这个 "delayed"python 生成器吗?

django Rest框架通过查找字段而不是pk 3.4 DRF访问项目

python - Django - python3.4 virtualenv - apache

python - 在 RedirectView 中添加自定义 http header

python - 如何在Python中反转子列表

python - 最小最大缩放器sklearn : should I normalize class labels too?

python - 如何预处理序数特征(其中特征值是数字范围)并相应地对它们进行排序或编码

python - Django:如何处理不适合模型的数据