Python变量范围和延迟查询集

2024-05-15 14:45:09 发布

您现在位置: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_或_404时,新的News对象返回404。在


Tags: 模块视图liveobjectsstatuscountprodcontent
1条回答
网友
1楼 · 发布于 2024-05-15 14:45:09

不,它们是在模块级别还是在视图级别都无关紧要。在

声明本身不触发db请求。只有当您请求具体的结果(例如count或start iterating)时,才会发生实际的db命中。在

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

更新:
.count()给出过时结果的问题更多地与django数据库查询caching有关,而不是懒惰。请考虑this question页以获得解决方法。在

相关问题 更多 >