假设我有一组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只访问数据库一次。这可能吗?
答案 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')