【问题标题】:Python variable scope and lazy querysetsPython 变量范围和惰性查询集
【发布时间】:2013-04-10 23:44:43
【问题描述】:

我正在使用 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 进程时才会更改。换句话说,新的 News 对象在视图中使用 get_object_or_404 时会返回 404。

【问题讨论】:

  • Django 或类似 SQLAlchemy 的东西?如果我们归结为特定的 ORM,可能会有所帮助。
  • @CppLearner django。我更新了我的问题。

标签: python django django-queryset


【解决方案1】:

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

声明本身不会触发数据库请求。只有当您要求具体结果(例如计数或开始迭代)时,才会发生实际的数据库命中。

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

更新:
.count() 给出过时结果的问题更多地与 django db 查询 caching 相关,而不是懒惰。考虑使用this question 页面来解决问题。

【讨论】:

  • 这是我最初的印象。查询集是惰性的。但我添加了一些额外的信息,这导致我的困惑。
  • 我认为它更适合完全作为另一个 SO 问题。你在这里回答了我的问题并证实了我的直觉。
猜你喜欢
  • 1970-01-01
  • 2017-12-08
  • 2015-10-13
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多