Django:tests.py将项目名称添加到类中

时间:2011-03-13 15:15:06

标签: python django

在我的views.py中,我有一段代码可以检查模型是否继承自其他模型。

 def inherits_from_animal(some_animal):
     return Animal in inspect.getmro(some_animal)

现在在我的views.py中,这有效,但在我的测试中,它失败了,因为项目的名称被添加到类名中。

因此,如果我有一个名为zoo的项目和名为animals的app,它看起来像:

views.py:

<class 'animals.models.Animal'>

tests.py:

<class 'zoo.animals.models.Animal'>

有人可以解释为什么会发生这种情况以及如何解决这个问题吗?

更新 似乎只发生在抽象模型中。

2 个答案:

答案 0 :(得分:1)

检查模块可能正在做些什么事。

Python只有这个场合才有内置函数issubclass()

def inherits_from_animal(some_animal):
    return issubclass(some_animal, Animal)

虽然我不明白为什么你现在无法使用inherits_from_animal来使用issubclass;)

答案 1 :(得分:1)

问题是manage.py。如果您将django应用程序放在其他包中,则应使用其完全限定的模块名称进行导入,并将其作为INSTALLED_APPS中的证据。

如果省略父包名称,它仍然有效,因为manage.py会暂时破坏sys.path以导入包含设置模块的模块。然后鼻子自己导入魔法,无法重现manage.py hack。

我建议使用django-admin.py而不是manage.py,因为它不执行任何导入技巧。 django没有项目的概念。只需将所有内容视为普通的python包并控制您的PYTHONPATH。