如何动态地创建一个现有的非抽象django模型,抽象?
我想我或多或少有一个非正统和黑客的问题.我目前拥有的是包含多个应用程序的
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,保留其所有功能,并将其元信息从非抽象更改为抽象(ModelB.Meta.abstract = True). 我现在拥有的是: # 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 对不起,如果我误解了你的目标,但我认为上面应该达到同样的最终结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Python开发的HTTP库requests详解
- python – Heroku上的Flask:对于大型POST数据,request.for
- Windows 配置Apache以便在浏览器中运行Python script的CGI模
- 用python实现高性能测试工具(二)
- python – 如何将Dropbox SDK导入Google App Engine应用程序
- django – 使用update_index –remove从Haystack / Xapian索
- python 中 property 属性的讲解及应用
- Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
- C如何能和Python一起编程,那么它们已经无敌了!Java靠边站
- 如何暂停Python中的所有其他线程?