加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何动态地创建一个现有的非抽象django模型,抽象?

发布时间:2020-12-20 13:14:51 所属栏目:Python 来源:网络整理
导读:我想我或多或少有一个非正统和黑客的问题.我目前拥有的是包含多个应用程序的 django项目. 我想使用一个应用程序(app1)的非抽象模型(ModelA),并通过继承它在另一个应用程序(app2)中使用它. App1的型号 不应该迁移到DB,我只想通过扩展其功能和逻辑来使用app1及
我想我或多或少有一个非正统和黑客的问题.我目前拥有的是包含多个应用程序的 django项目.
我想使用一个应用程序(app1)的非抽象模型(ModelA),并通过继承它在另一个应用程序(app2)中使用它. App1的型号
不应该迁移到DB,我只想通过扩展其功能和逻辑来使用app1及其模型类的功能.
我通过将两个应用程序添加到settings.INSTALLED_APPS来实现这一点,并防止将app1的模型迁移到数据库.

INSTALLED_APPS += (
    'App1','App2',)

# This is needed to just use App1's models
# without creating it's database tables
# See: https://stackoverflow.com/a/35921487/1230358
MIGRATION_MODULES = {
    'App1': None,}

到目前为止,这么好,丑陋和hackish,我知道……现在剩下的问题是app1的大部分模型都是非抽象的(ModelA),如果我尝试的话
要对它们进行子类化,ModelA的所有字段都不会填充到名为app2_modelb的表中.这对我来说很清楚,因为我排除了App1
迁移到数据库,因此数据库中完全缺少表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应用程序.

解决方法

为什么不,在app1

AbstractBaseModelA(models.Model):
    # other stuff here
    class Meta:
        is_abstract=True


ModelA(AbstractBaseModelA):
    # stuff

在app2中:

MobelB(AbstractBaseModelA):
    # stuff

对不起,如果我误解了你的目标,但我认为上面应该达到同样的最终结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读