Python Django:将模型重构为子模块
在一个应用程序中的models.py变得相当大之后,我尝试将一些类移动到子包中 旧建筑是这样的: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) 这项工作没有问题,因此我不
# 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在哪里产生错误?