在一个应用程序中的models.py变得非常大之后,我试图将一些类移动到子包中。
旧结构是这样的:
# File: assets/models.py
class Asset(...):
# lots of irrelevant code
# File: widgets/models.py
from assets.models import Asset
class Video(...):
asset = models.ForeignKey(Asset)
这没有问题,所以我不会详细介绍结构。
我现在尝试做的是将Asset
类移动到子模块中。结构现在如下:
# File: assets/models/__init__.py (of course I deleted the old models.py)
from .assets import Asset
# File: assets/models/assets.py
class Asset(...):
# lots of irrelevant code
# File: widgets/models.py
from assets.models.assets import Asset
class Video(...):
asset = models.ForeignKey(Asset)
不知何故,这不起作用,我无法弄清楚究竟是什么导致了麻烦。我得到的错误是:
widgets.video:'asset'与模型有关系,该模型尚未安装或 是抽象的
答案 0 :(得分:5)
如果模型位于嵌套的子模块中(即不直接位于APPNAME.models中),Django似乎无法可靠地检测模型所属的应用程序。
这是一个已知问题,可以通过添加以下行(在本例中为Asset
类)来解决,从而明确定义模型所属的应用程序:
class Asset(models.Model):
...
class Meta:
app_label = 'assets'
...
参考文献:
答案 1 :(得分:0)
您应该像以前一样从models
导入:
from assets.models import Asset
这使您始终可以从models
导入,但可以在models
目录中单独组织模型。从概念上讲,它还意味着Asset
仍然在models
,因为ForeignKey
引用了assets.models.Asset
个对象,而不是assets.models.assets.Asset
。