给定以下模型
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/