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

How do I unload (reload) a Python module?

由于某些原因,我在Django的"manage.py shell"解释器会话中无法做到这一点.要重新创建我的问题,请开始这里提供的基本Django教程:

Writing your first Django app, part 1

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

import polls.models as pm

创建一个新的"Poll"对象:

p = pm.Poll()

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

def x(self):
    return 2+2

现在返回到解释器并"重新加载"模块:

reload(pm)

现在try 使用您的新方法或属性:

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

您将收到以下消息:

'Poll' object has no attribute 'x'

怎么回事?我还try 重新运行导入命令,使用不同的语法导入模块,删除对任何"Poll"对象或"Poll"类的所有引用.我还在IPython解释器和普通Python(v2.6)解释器中try 了这一点.似乎什么都不管用.

在常规解释器会话中对任意Python模块使用相同的技术可以完美地工作.我就是不能让它在Django 的"shell"会话中工作.

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

推荐答案

嗯,我想我得回答这个问题.问题是Django将其模型缓存在称为AppCache的单例(类似单例的 struct )中.基本上,要重新加载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

我已经将所有这些放在Django站点根目录下一个名为reloadmodel s.py的单独文件中.使用IPython,我可以通过运行以下命令重新加载所有内容:

%run ~/mysite/reloadmodels.py

Django相关问答推荐

使用Django ORM在不相关的模型之间进行左外连接?

Django中有修改字段值的挂钩吗?

Django、htmx删除记录并更新

Django相关对象引用模板

Django没有';t显示黄页

Django REST序列化程序TO_REATION失败

Django中每个类型/代理的最新行

Django 根据子级过滤父级

Django 转储数据将附加数据添加到 json 导出

Django授权判断具有通配符模式的URL

是否可以在 Django 中重命名应用程序的组名?

防止 django 将_id附加到外键字段

try 编辑/创建时,特定模型的 Django 管理员挂起(直到超时错误)

使用移动应用程序保护通信 [真实性、隐私和完整性]?

如何缓存 Django Rest Framework API 调用?

使用 Python / Django 的 Google API 示例的 Oauth

Python 社区里的小马是怎么回事?

保存前向 ModelForm 对象添加数据

如何将 django csrf 令牌直接嵌入 HTML?

Django 用户配置文件