在我的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'>
有人可以解释为什么会发生这种情况以及如何解决这个问题吗?
更新 似乎只发生在抽象模型中。
答案 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。