ModelForm 中 ModelChoiceField 的当前日期的动态查询集

Dynamic queryset with current date for a ModelChoiceField in a ModelForm

我看过很多类似的问题,但是没有人说明它是在我们第一次 运行 服务器时启动的,还是每次我们在浏览器中刷新页面时启动的。

我有一个像这样的模型:

class TestForm(ModelForm):
    field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today()))

如果我昨天 运行 服务器今天刷新页面,我仍然有昨天日期时间的对象。

您拥有的代码将在服务器启动时 运行 一次。如果您希望在每次刷新页面时检查日期,您可以传递 datetime.today 函数而不是值:

class TestForm(ModelForm):
    field1 = ModelChoiceField(queryset=Model.objects.filter(datetime=datetime.today))

问题是当服务器首次加载时,您的查询集被评估一次。

解决方法是在表单的__init__方法中设置查询集,这样每次实例化表单时都会计算查询集。

class TestForm(ModelForm):
    # Use the empty qs .none() here, we override it in __init__ anyway
    field1 = ModelChoiceField(queryset=Model.objects.none())

    def __init__(self, *args, **kwargs):
        super(TestForm, self).__init__(*args, **kwargs)
        self.fields['field1'].queryset = Model.objects.filter(datetime=datetime.today())

Starting with Django 1.9可以在查询级别获取当前时间:

from django.db.models.functions import Now
Model.objects.filter(datetime=Now())

Now() 将在查询执行时计算(而不是在 Python 代码中执行 Now() 时计算)。但是请注意,Now() 报告数据库服务器已知的时间。