Python DetailedView和过期项目在Django中不起作用

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

我正在开发一个简单的应用程序,其中元素应该在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_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”属性。