Python DetailedView和过期项目在Django中不起作用
我正在开发一个简单的应用程序,其中元素应该在5分钟后自动过期 在models.py中,我有以下内容:Python DetailedView和过期项目在Django中不起作用,python,django,Python,Django,我正在开发一个简单的应用程序,其中元素应该在5分钟后自动过期 在models.py中,我有以下内容: from django.utils import timezone def calc_default_expire(): return timezone.now() + timezone.timedelta(minutes=5) class MyModel(models.Model): uploaded_at = models.DateTimeField(auto_now_a
from django.utils import timezone
def calc_default_expire():
return timezone.now() + timezone.timedelta(minutes=5)
class MyModel(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
expire_date = models.DateTimeField(default=calc_default_expire)
...
from django.views.generic import DetailView
from .models import MyModel
from django.utils import timezone
class MyModelDetail(DetailView):
model = MyModel
queryset = MyModel.objects.filter(expire_date__gt=timezone.now())
在my views.py中,我有以下内容:
from django.utils import timezone
def calc_default_expire():
return timezone.now() + timezone.timedelta(minutes=5)
class MyModel(models.Model):
uploaded_at = models.DateTimeField(auto_now_add=True)
expire_date = models.DateTimeField(default=calc_default_expire)
...
from django.views.generic import DetailView
from .models import MyModel
from django.utils import timezone
class MyModelDetail(DetailView):
model = MyModel
queryset = MyModel.objects.filter(expire_date__gt=timezone.now())
我有一些奇怪的行为。即使在5分钟后,当我调用过期项目的url时,它仍然会返回(http代码200)
然而,当我重新启动内置的django-dev服务器并再次调用url时,我得到了一个404,这是期望的结果
我看到两个可能的原因:
- 内置的Web服务器正在缓存一些东西(老实说,我怀疑这一点,我在文档中找不到任何提到这种行为的内容)
- 我在queryset筛选器中出错(但我没有看到)
在my settings.py BTW中使用_TZ=True
。这非常有意义,因为启动服务器时,时区.now()将被评估一次。在这之后,它将使用相同的日期时间进行每次查询
您可以改为使用,这将让数据库确定时间:
from django.db.models.functions import Now
class MyModelDetail(DetailView):
model = MyModel
queryset = MyModel.objects.filter(expire_date__gt=Now())
视图的queryset属性中的timezone.now()
的值在导入时进行计算,并且从未更改
无论何时,只要queryset中有任何动态属性,或者任何类级属性,都应该将其移动到方法中:
class MyModelDetail(DetailView):
def get_queryset(self):
return AppFile.objects.filter(expire_date__gt=timezone.now())
(注意,我不明白为什么您同时定义了model和queryset,更不明白为什么您对每一个都使用不同的模型;如果您定义了queryset,model属性将被忽略。)正在更改copypaste中的一些内容,AppFile应该是MyModel。我现在在原来的问题中解决了这个问题。谢谢你指出这一点。是的,我从“模型”开始,后来通过查询集添加了额外的约束。应该删除“model”属性。