Django:将模型重构为子模块

时间:2013-11-28 17:42:03

标签: python django django-models refactoring

在一个应用程序中的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'与模型有关系,该模型尚未安装或   是抽象的

2 个答案:

答案 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