Python queryset中缺少对象
我有一个模型:Python queryset中缺少对象,python,django,django-queryset,Python,Django,Django Queryset,我有一个模型: class Post(models.Model): is_active = models.BooleanField() created = models.DateTimeField() 和两个CBV:PostListView和PostDetailView queryset = Post.objects.filter(is_active=True, created__lt=timezone.now()) 在这两种情况下 问题:在没有一个Post实例的情况下,每第
class Post(models.Model):
is_active = models.BooleanField()
created = models.DateTimeField()
和两个CBV:PostListView和PostDetailView
queryset = Post.objects.filter(is_active=True, created__lt=timezone.now())
在这两种情况下
问题:在没有一个Post实例的情况下,每第二次PostListView呈现响应都会创建created=datetime.datetime(2014,5,29,13,40,tzinfo=)
。PostDetailView返回404(每2次响应!)。没关系,当我试图在shell中复制bug时:
>>> Post.objects.filter(is_active=True, created__lte=timezone.now())
[<Post: 1>, <Post: 2>]
>>> Post.objects.filter(is_active=True, created__lte=timezone.now())
[<Post: 1>, <Post: 2>]
>>> Post.objects.filter(is_active=True, created__lte=timezone.now())
[<Post: 1>, <Post: 2>]
>>> Post.objects.filter(is_active=True, created__lte=timezone.now())
[<Post: 1>, <Post: 2>]
>>Post.objects.filter(是\u active=True,created\u lte=timezone.now())
[, ]
>>>Post.objects.filter(是\u active=True,created\u lte=timezone.now())
[, ]
>>>Post.objects.filter(是\u active=True,created\u lte=timezone.now())
[, ]
>>>Post.objects.filter(是\u active=True,created\u lte=timezone.now())
[, ]
更新:
class PostListView(ListView):
queryset = Post.objects.filter(is_active=True, created__lt=timezone.now())
context_object_name = 'posts'
def get_context_data(self, **kwargs):
context = super(PostListView, self).get_context_data(**kwargs)
context['recommended'] = self.get_queryset().filter(is_recommended=True)[:5]
return context
class PostDetailView(DetailView):
queryset = Post.objects.filter(is_active=True, created__lt=timezone.now())
context_object_name = 'post'
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['recommended'] = self.get_queryset().filter(is_recommended=True)[:5]
return context
print self.get_queryset().query
SELECT `blog_post`.`id`, `blog_post`.`title`, `blog_post`.`slug`, `blog_post`.`meta_description`, `blog_post`.`img`, `blog_post`.`announcement`, `blog_post`.`content`, `blog_post`.`author_id`, `blog_post`.`is_innovation`, `blog_post`.`is_recommended`, `blog_post`.`is_active`, `blog_post`.`created` FROM `blog_post` WHERE (`blog_post`.`created` < 2014-06-04 15:02:44 AND `blog_post`.`is_active` = True ) ORDER BY `blog_post`.`created` DESC
类PostListView(ListView):
queryset=Post.objects.filter(是否处于活动状态=True,是否已创建\uu lt=timezone.now())
上下文\对象\名称='posts'
def获取上下文数据(自身,**kwargs):
context=super(PostListView,self)。获取上下文数据(**kwargs)
context['recommended']=self.get\u queryset().filter(is\u recommended=True)[:5]
返回上下文
类PostDetailView(DetailView):
queryset=Post.objects.filter(是否处于活动状态=True,是否已创建\uu lt=timezone.now())
上下文\对象\名称='post'
def获取上下文数据(自身,**kwargs):
context=super(PostDetailView,self)。获取上下文数据(**kwargs)
context['recommended']=self.get\u queryset().filter(is\u recommended=True)[:5]
返回上下文
打印self.get_queryset().query
选择“博客帖子”。`id`、`blog帖子`.`title`、`blog帖子`.`slug`、`blog帖子`.`meta描述`、`blog帖子`.`img`、`blog帖子`.`announcement`、`blog帖子`.`content`、`blog帖子`.`author帖子`、`blog帖子`.`is innovation`、`blog帖子`.`is推荐`、`blog帖子`.`is active`、`blog帖子`.`blog帖子`.`is active`、`blog帖子`是从哪里创建的(`blog_post`.`created`<2014-06-04 15:02:44和`blog_post`.`is_active`=True)按`blog_post`.`created`DESC
打印Post.objects.filter(是否处于活动状态=True,是否已创建\u lt=timezone.now()).query
选择blog\u post
id
,blog\u post
,blog\u post
,slug
,blog\u post
元描述,blog\u post
img
,blog\u post
公告,blog\code>内容
e> 作者id
,blog\u post
是创新的
,blog\u post
是推荐的
,blog\u post
是活动的
,blog\u post
是从blog\u post
创建的,其中(blog\u post
已创建
<2014-06-04 15:11:42和blog\u post
处于活动状态
=True)按blog\u post
创建DESC
在nginx+gunicorn+gevent(Ubuntu服务器,MySQL)上运行。如果要对queryset过滤器使用函数调用,则不能将其设置为属性。必须重写
get\u queryset
def get_queryset(self):
queryset = super(PostListView, self).get_queryset()
return queryset.filter(is_active=True, created__lt=timezone.now())
原因是timezone.now()将始终返回类首次编译时的值。使用
.filter(created\uu lt=timezone.now)可能可以避免此问题
但我没有尝试过。有关您的视图PostListView和PostDetailView的更多详细信息?将打印查询集。查询
放入您的视图中,并与控制台中的相同内容进行比较,如果没有什么不同您是在集成开发服务器上还是在运行“live”。如果处于活动状态,如果您最近更改了源代码,请尝试重新启动您的服务器…这可能与服务体系结构有关。您是否有多台服务器使用负载平衡器运行?如何启动服务器以重现此问题?@AlexShkop我尝试在shell中重现此问题(此问题可能与“已创建”字段相关)