当tests.py运行时,Django Reimport模块

时间:2011-04-09 20:56:36

标签: python django

我正在开发一个Django应用程序,它会在所有模型上提前执行一些类内省。

如果这些模型在models.py中定义,这似乎工作正常,但如果我在tests.py中定义它们,__ init__.py看不到那些模型。

目标是拥有一个在加载__init__.py时运行一次的模块级字典:

perms_dict = {}
for cls in Models.__subclasses__():
    add some stuff to perms_dict

运行测试时,此代码块会运行两次,第一次看不到tests.py中的Models,第二次看到tests.py模型。不幸的是,当在__init__.py文件中调用函数时,由于某种原因它似乎使用了初始运行中的perms_dict,并且不包括tests.py中的模型。

最简单的解决方案是从__init__.py中导入tests.py,以便它知道这些模型,但显然在实际使用中是不可取的。

Git回购可在以下网址获得:git://github.com/philipkimmey/django-cerberus.git

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的核心任务似乎是为每个模型运行一次代码。现在有一个很好的解决方案:来自django builtins的class_prepared信号。

http://docs.djangoproject.com/en/1.3/ref/signals/#class-prepared

至于提前进行内省,在某些情况下这可能是不可取的 - 例如,当动态创建模型类时。我建议最初只加载models.py并让信号处理程序在导入后处理剩余的模型类。

相关问题