Django QuerySet:按日期过滤,然后再选择一个

时间:2013-07-12 21:56:53

标签: python django django-queryset

假设我有一组Model对象,每个对象都标有日期和时间。我想选择所有带有过去日期的项目, plus 最接近今天但未来的日期。到目前为止,我有这个:

from django.utils.timezone import now
from models import Resource

next = Resource.objects.filter(date__gt=now()).reverse()[0]
archive = Resource.objects.filter(date__lt=now())

这看起来很笨重。我想知道是否有一种方法可以使用一个(干净的)QuerySet只访问数据库一次。这可能吗?

1 个答案:

答案 0 :(得分:1)

您可能无法通过一次数据库调用来执行此操作,因为除非您进行一些预处理,否则无法提前知道下一个date将会是什么。

一种方法是:

next = Resource.objects.filter(date__gt=now()).order_by('date')[:1]
archive = Resource.objects.filter(date__lt=now())
qs = list(chain(archive, next))

OR

qs = list(archive, next)

另一种涉及快速查找的方法是

dt = None
now = now()

next = Resource.objects.filter(date__gt=now()).order_by('date')[:1]
if next.exists(): #A quick lookup for the date
    now = next[0].date

archive = Resource.objects.filter(date__lt=now).order_by('date')