簡體   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