Python变量作用域和延迟查询集



我使用的是Django及其开箱即用的ORM。如果有一些模块级变量,它们是否只在应用程序启动时被评估?或者如果在视图中被修改,它们也会对每个请求进行评估?一个例子:

from news.models import News
# Module level variables
draft_news = News.objects.filter(status='draft') 
live_news = News.objects.filter(status='prod')
def view(request):
    # outputs 10 an 10, respectively.
    print 'There are %d news objects and %d live objects. Adding a draft article' % (draft_news.count(), live_news.count()) 
    n = News(
        content='This is test content',
        status='draft',
        slug='this-is-a-test3',
        pubdatetime=datetime.now(),
    )
    n.save()
    print '...done. There are %d draft news objects.' % draft_news.count() # 11 objects
    print 'Changing status to live...'
    n.status='prod'
    n.save()
    print 'There are now %d live objects.' % live_news.count() # 11 objects

因为查询集是懒惰的,它是否重要,如果他们是在模块级别或视图级别?我最初在一个管理命令中测试了上面的代码。

让我们假设重构不是一个选项。

附加信息:我有几个应用服务器(uWSGI)共享相同的数据库。似乎只有当我重新启动所有模块上的uWSGI进程时,模块级变量才会发生变化。换句话说,当在视图中使用get_object_or_404时,新的News对象返回404。

不,不管它们是在模块级还是视图级。

声明本身不会触发db请求。只有当你请求具体的结果(比如count或开始迭代)时,才会发生实际的db命中。

建议将它们保持在视图级别,以保持全局命名空间的整洁。

更新:
.count()给出过时结果的问题更多地与django db查询缓存有关,而不是懒惰。

最新更新