Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python queryset中缺少对象_Python_Django_Django Queryset - Fatal编程技术网

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中重现此问题(此问题可能与“已创建”字段相关)