这是一个场景:
我想每天发布一件商品。有时我会添加多个项目并在管理网站上的不同pub_date
上设置它们。通过设置类似此item.objects.exclude(pub_date__gt=timezone.now().date())
的查询集,这将阻止未来发布日期的项目发布。但是,我没有得到我预期的结果。附:我在python manage.py shell
上得到了我的预期结果,如果手动重启我的服务器 - gunicorn,则会发布这些项目。
也许它与我的服务器Upstart脚本相关,就在这里,
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid myid
setgid www-data
chdir /home/myid/my_repo_dir/my_proj_dir
exec /home/myid/.virtualenvs/my_proj_env/bin/gunicorn --workers 3 --bind unix:/home/my_id/my_repo_dir/my_proj_dir/project.sock config.wsgi:application$
以下是观点:
class HomeView(ListView):
queryset = Item.objects.exclude(pub_date__gt=timezone.now().date())
template_name = 'home.html'
context_object_name = 'items'
我无法理解的是,视图和python manage.py shell
中的相同代码会产生不同的结果。
答案 0 :(得分:1)
覆盖get_queryset
,以便每次运行视图时评估查询集。
class HomeView(ListView):
def get_queryset(self) :
return Item.objects.exclude(pub_date__gt=timezone.now().date())
目前,您已设置queryset
。这会导致在服务器启动并加载视图时提取一次查询集。在重新启动服务器之前,它不会更改。
答案 1 :(得分:0)
我建议您从使用upstart切换到gunicorn + supervisor,这样您就可以更轻松地重新启动django应用程序。此外,如果您可以添加更多关于如何实现查询集的代码段,这将会很有帮助。
答案 2 :(得分:0)
在某些情况下(specifically ModelField default values),.now()。date()在服务器启动时计算,而不是在调用方法时计算。在这种情况下,您删除括号。
这可以解释为什么它在你的shell中工作(因为你的shell总是今天的日期)。
尝试从item.objects.exclude(pub_date__gt=timezone.now().date())
移除括号,使其成为item.objects.exclude(pub_date__gt=timezone.now.date)
。