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()
报告数据库服务器已知的时间。
我看过很多类似的问题,但是没有人说明它是在我们第一次 运行 服务器时启动的,还是每次我们在浏览器中刷新页面时启动的。
我有一个像这样的模型:
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()
报告数据库服务器已知的时间。