[英]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.