我知道如何在常规 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/