通过Django Rest Framework API,我正在尝试在未来为所有对象提供日期时间。
问题是,一旦服务器启动,每次提交查询时,API都会为日期时间大于服务器启动日期时间的所有对象提供服务,而不是为日期时间小于当前时间的对象提供服务
from django.utils import timezone
class BananasViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Banana.objects.filter(date_and_time__gte=timezone.now())
...
运气不好的情况下,我也尝试了这种变体:
import datetime as dt
class BananasViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Banana.objects.filter(date_and_time__gte=
timezone.make_aware(dt.datetime.now(), timezone.get_current_timezone())
...
在Django shell中进行类似的查询可以正确地返回最新的对象。。。
由于当前编写的是应用程序代码,所以当第一次从任何地方导入类时,您只运行timezone.now()
一次。
与其在类属性本身上应用时间查询集筛选,不如在get_queryset()
方法中这样做,以便在每次传递时重新评估它
例如。
class BananasViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Banana.objects.all()
def get_queryset(self):
cutoff = timezone.now()
return self.queryset.filter(date_and_time__gte=cutoff)
timezone.now()
此函数返回当前时间。它不会返回服务器启动的时间。因此,根据您的查询,您要求Banana模型上的date_and_time
字段大于当前时间的过滤器。
这个查询实际上似乎不合适,因为在date_and_time
字段大于或等于timezone.now()
的时候不能创建任何对象
把这样的东西放在构造函数中不是更好吗?这样你就可以预测实际调用timezone.now((的时间了?
from django.utils import timezone
class BananasViewSet(viewsets.ReadOnlyModelViewSet):
def __init__(self,*args,**kwargs):
super(BananasViewSet,self).__init__(*args,**kwargs)
self.queryset = Banana.objects.filter(date_and_time__gte=timezone.now())