Django:timezone.now()不返回当前日期时间



通过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())

相关内容

  • 没有找到相关文章

最新更新