Python Django:将模型重构为子模块

Python Django:将模型重构为子模块,python,django,django-models,refactoring,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) 这项工作没有问题,因此我不

在一个应用程序中的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:“资产”与模型有关系,该模型要么尚未安装,要么尚未安装 是抽象的


您应该像以前一样从
模型导入:

from assets.models import Asset

这允许您始终从
模型
导入,但在
模型
目录中单独组织模型。从概念上讲,这还意味着
资产
仍在
模型中
,因为您的
外键
引用的是
资产.models.Asset
对象,而不是
资产.models.assets.Asset

如果模型位于嵌套子模块中,Django似乎无法可靠地检测出它属于哪个应用程序(即,不直接在APPNAME.models内部)

这是一个已知的问题,可以通过添加以下行(在本例中为
资产
类)来解决,从而明确定义模型所属的应用程序:

class Asset(models.Model):
    ...
    class Meta:
        app_label = 'assets'
    ...
参考资料:


谢谢!我刚刚试过,Django仍然会给出同样的错误,不幸的是。@DaveVogt:你可以发布堆栈跟踪吗?Django在哪里产生错误?