Django 查询基于更大的日期

Django query bases on greater date

我想知道使用 django 查询完成此过滤器的效率如何。基本上我有以下两个类

class Act(models.Model):
    Date = models.DateTimeField()
    Doc = models.ForeignKey(Doc)
    ...

class Doc(models.Model):
    ...

所以一个 Doc 可以有多个 Acts,对于每个 Doc,我想获得具有更大日期的 act。我只对 Acts 对象感兴趣。

例如,如果有

act1 = (Date=2021-01-01, Doc=doc1)
act2 = (Date=2021-01-02, Doc=doc1)
act3 = (Date=2021-01-03, Doc=doc2)
act4 = (Date=2021-01-04, Doc=doc2)
act5 = (Date=2021-01-05, Doc=doc2)

我想获得 [act2, act5](日期较大的 Doc=doc1 和日期较大的 Doc=doc2 的 Act)。

我唯一的解决办法是在 Docs 上创建一个 for。

非常感谢

您可以使用一个或两个查询来执行此操作:第一个查询将检索每个 Doc 的最新 Act,然后第二个查询将检索行为:

from django.db.models import OuterRef, Subquery

last_acts = Doc.objects.annotate(
    latest_act=Subquery(
        Act.objects.filter(
            <strong>Doc_id=OuterRef('pk')</strong>
        ).values('pk').order_by('-Date')[:1]
    )
).values('latest_act')

然后我们可以检索对应的Acts:

Act.objects.filter(<strong>pk__in=last_acts</strong>)

根据数据库的不同,首先检索主键可能更有效,然后然后进行额外查询:

Act.objects.filter(pk__in=<strong>list(</strong>last_acts<strong>)</strong>)