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')
然后我们可以检索对应的Act
s:
Act.objects.filter(<strong>pk__in=last_acts</strong>)
根据数据库的不同,首先检索主键可能更有效,然后然后进行额外查询:
Act.objects.filter(pk__in=<strong>list(</strong>last_acts<strong>)</strong>)
我想知道使用 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')
然后我们可以检索对应的Act
s:
Act.objects.filter(<strong>pk__in=last_acts</strong>)
根据数据库的不同,首先检索主键可能更有效,然后然后进行额外查询:
Act.objects.filter(pk__in=<strong>list(</strong>last_acts<strong>)</strong>)