首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态地建立现有的非抽象django模型,抽象的?

如何动态地建立现有的非抽象django模型,抽象的?
EN

Stack Overflow用户
提问于 2016-11-02 09:01:28
回答 1查看 497关注 0票数 4

我想我有一个或多或少不正统的问题要问你。我目前拥有的是django项目,它有多个应用程序。我想使用一个应用程序的non-abstract model (ModelA) (app1),并通过子类在另一个应用程序(app2)中使用它。不应该将app1的模型迁移到DB,我只想通过扩展app1的功能和逻辑来使用它及其模型类的功能。我通过将这两个应用程序添加到settings.INSTALLED_APPS并防止app1的模型迁移到DB来实现这一点。

代码语言:javascript
复制
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)中找到。

我现在拥有的是:

代码语言:javascript
复制
# 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

我目前制作非抽象模型抽象的方法(伪代码)如下所示:

代码语言:javascript
复制
# 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应用程序?

EN

回答 1

Stack Overflow用户

发布于 2016-11-02 09:09:56

为什么不呢,在app1

代码语言:javascript
复制
AbstractBaseModelA(models.Model):
    # other stuff here
    class Meta:
        is_abstract=True


ModelA(AbstractBaseModelA):
    # stuff

在app2中:

代码语言:javascript
复制
MobelB(AbstractBaseModelA):
    # stuff

如果我误解了你的目标,很抱歉,但我认为上面的结果应该是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40375917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档