2013-07-10 59 views
2

我是django的新手,所以这一定是一个愚蠢的问题,但我正在通过官方文档教程(关于一个网站的民意调查和选择)我的方式,我想过滤掉没有民意调查选择时,我成功地做到这一点与在ListView的查询集参数的过滤器:使用Django过滤器

queryset=Poll.objects.filter(pub_date__lte=timezone.now).filter(id__in=Choice.objects.all).order_by('-pub_date')[:5] 

这的确筛选查询,问题是,如果我选择添加到民意调查没有任何选择从管理网站,这将不会反映在网站上,直到我重新启动服务器或我更改项目中的一些代码,即使我传递一个可调用对象作为参数的过滤器(这是相同的以前的过滤器在同一行),我在搜索其余的文档,我也看了django权威指南,但我什么也没找到,这可以帮助我,所以我不知道如果有代码有问题,或者我缺乏对django或特定的一些理解python本身的概念

+0

没有该查询创建一个SQL子查询通过使用民意调查和选择之间的连接来测试ID是否在选择表中? –

回答

1

您当前的查询不正确,因为如果数据库中存在相同ID的选择对象(这是不准确的),您正在过滤轮询ID。

要过滤掉民调没有选择,你需要做的

queryset=Poll.objects.filter(choice__isnull=False).order_by('-pub_date').distinct()[:5] #Get only polls with a choice. 

现在,每次投票前,现在可以被过滤这样的:

queryset = Poll.objects.filter(choice__isnull=False, pub_date__lte=timezone.now()).order_by('-pub_date').distinct()[:5] 
+0

好吧,但是这样做解决了我从管理网站进行更改后无需重新启动服务器的问题吗? –

+0

这个问题不应该在那里摆在首位。不知道为什么会发生这种情况 – karthikr

+0

karthikr我写了你发布的第二行代码,但是现在轮询对于它的每个选择都会显示一次,timezone.now仅在服务器第一次运行时计算(第二个事实显示在教程 –