python - 如何通过 "manage.py shell"使用交互式解释器重新加载 Django 模型模块?

标签 python django

我知道如何在常规 Python 解释器 session 中重新加载常规 Python 模块。这个问题记录了如何很好地做到这一点:

How do I unload (reload) a Python module?

出于某种原因,我在 Django 的“manage.py shell”解释器 session 中遇到了麻烦。要重新创建我的问题,请启动此处的基本 Django 教程:

Writing your first Django app, part 1

创建“polls”应用程序和“Poll”类后,通过“manage.py shell”启动解释器并将“polls”应用程序导入其中。

import polls.models as pm

创建一个新的“投票”对象:

p = pm.Poll()

到目前为止一切都很好。现在回到您的源并添加任意方法或属性。例如,我添加了:

def x(self):
    return 2+2

现在回到解释器并“重新加载”模块:

reload(pm)

现在尝试使用你的新方法或属性:

p1 = pm.Poll()
p1.x()

您将收到以下消息:

'Poll' object has no attribute 'x'

什么给了?我还尝试重新运行导入命令,使用不同的语法导入模块,删除对任何“轮询”对象或“轮询”类的所有引用。我也用 IPython 解释器和普通的 Python (v2.6) 解释器尝试过这个。似乎没有任何效果。

在常规解释器 session 中对任意 Python 模块使用相同的技术非常有效。我似乎无法让它在 Django 的“shell” session 中工作。

顺便说一句,如果有什么不同的话,我是在 Ubuntu 9.04 机器上做的。

最佳答案

嗯,我想我必须回答这个问题。问题是 Django 将其模型缓存在一个称为 AppCache 的单例(类似单例的结构)中。基本上,要重新加载 Django 模型,您需要首先重新加载并重新导入存储在 AppCache 中的所有模型模块。然后你需要清除 AppCache。这是它的代码:

import os
from django.db.models.loading import AppCache
cache = AppCache()

curdir = os.getcwd()

for app in cache.get_apps():
    f = app.__file__
    if f.startswith(curdir) and f.endswith('.pyc'):
        os.remove(f)
    __import__(app.__name__)
    reload(app)

from django.utils.datastructures import SortedDict
cache.app_store = SortedDict()
cache.app_models = SortedDict()
cache.app_errors = {}
cache.handled = {}
cache.loaded = False

我将所有这些都放在了一个名为 reloadmodels.py 的单独文件中,该文件位于我的 Django 站点的根目录中。使用 IPython,我可以通过运行重新加载所有内容:

%run ~/mysite/reloadmodels.py

关于python - 如何通过 "manage.py shell"使用交互式解释器重新加载 Django 模型模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890924/

相关文章:

python - 我如何轻松地从斯坦福大学解析 python 中的数据绘制解析树?

c++ - py.test 与非 python 测试(具体来说,与 cxxtest)

html - <h1> 样式不起作用,但其他人会

python - 在 Python 中模拟 ImportError

python - 如何在 Theano 中更新扫描 Cython 代码?

python - 查看 Python (Django) 中的当前日志记录配置

python - Django/python postgresql 原始 sql 问题

django - Nginx:CentOS 7 上 Gunicorn 套接字的权限被拒绝

django - django 中是否有相当于 Rails Try 的功能?

python - 使用 np.nan 替换数组的所有元素时出现的问题