我想我有一个或多或少不正统的问题要问你。我目前拥有的是django项目,它有多个应用程序。我想使用一个应用程序的non-abstract model (ModelA) (app1),并通过子类在另一个应用程序(app2)中使用它。不应该将app1的模型迁移到DB,我只想通过扩展app1的功能和逻辑来使用它及其模型类的功能。我通过将这两个应用程序添加到settings.INSTALLED_APPS并防止app1的模型迁移到DB来实现这一点。
INSTALLED_APPS += (
'App1',
'App2',
)
# This is needed to just use App1's models
# without creating it's database tables
# See: http://stackoverflow.com/a/35921487/1230358
MIGRATION_MODULES = {
'App1': None,
}到目前为止还不错,丑陋和粗鲁,我知道.剩下的问题是,大多数app1的模型都是非抽象的(ModelA),如果我试图对它们进行子类,那么模型的任何字段都不会被填充到名为app2_modelb的表中。这一点对我来说很清楚,因为我没有将App1迁移到DB,因此在DB中完全缺少表app1_modela。
我现在的想法是克隆ModelA,保留它的所有功能,并将它的元信息从非抽象更改为抽象(ModelB.Meta.abstract = True)。我希望通过这种方式,ModelA的所有原始字段都将继承到ModelB中,并且可以在其各自的DB表和列(app1_modelb)中找到。
我现在拥有的是:
# In app1 -> models.py
class ModelA(models.Model):
title = models.CharField(_('title'), max_length=255)
subtitle = models.CharField(_('subtitle'), max_length=255)
class Meta:
abstract = False # just explicitly for demonstration
# In app2 -> models.py
from app1.models import ModelA
class ModelB(ModelA):
pass
# Just extending ModelAdoes not create the fields title and subtitle fields in app2_modelb
# because ModelA.meta.abstract = False我目前制作非抽象模型抽象的方法(伪代码)如下所示:
# In app2 -> models.py
from app1.models import ModelA
def get_abstract_class(cls):
o = dict(cls.__dict__)
o['_meta'].abstract = True
o['_meta'].app_label = 'app2'
o['__module__'] = 'app2.models'
#return type('Abstract{}'.format(cls.__name__), cls.__bases__, o)
return type('Abstract{}'.format(cls.__name__), (cls,), o)
ModelB = get_abstract_class(ModelA)
class ModelC(ModelB):
# title and subtitle are inherited from ModelA
description = models.CharField(_('description'), max_length=255)这是行不通的,经过这个冗长的描述,我(简单的)问题将是,是否以及如何能够克隆一个非抽象模型类,保持其所有功能,以及如何将其更改为抽象类?
只是想澄清一下。所有的上层模糊是关于,我不能改变任何代码在app1。也许app1是通过pip.安装的django应用程序?
发布于 2016-11-02 09:09:56
为什么不呢,在app1
AbstractBaseModelA(models.Model):
# other stuff here
class Meta:
is_abstract=True
ModelA(AbstractBaseModelA):
# stuff在app2中:
MobelB(AbstractBaseModelA):
# stuff如果我误解了你的目标,很抱歉,但我认为上面的结果应该是一样的。
https://stackoverflow.com/questions/40375917
复制相似问题