为了账号安全,请及时绑定邮箱和手机立即绑定

Django 中如何批量创建models? 如何抽象出这个类?

Django 中如何批量创建models? 如何抽象出这个类?

至尊宝的传说 2019-05-24 10:59:56
一段代码如下fromdjango.dbimportmodelstable_name="新闻"classPerson(models.Model):classMeta:db_table=table_nameapp_label=table_nametitle=models.CharField("title",max_length=300)content=models.TextField("content",max_length=300)现在的需求是,我如何把这个方法抽象出来?意思就是说,我直接给Person这个类可以传入参数,然后在里面的classMeta中可以直接用我最早想到是这样classPerson(models.Model):def__init__(self,table_name):self.table_name=table_nameclassMeta:db_table=self.table_nameapp_label=self.table_nametitle=models.CharField("title",max_length=300)content=models.TextField("content",max_length=300)但是失败了,不能直接传入参数?这导致很不灵活,我如果有10个models要健但是他们除了表名称不一样,其他都是一样~那这样不是很不灵活当然也可以把这些数据全部放在一张表里面,但是感觉考虑到后期的数据量以及查询效率的问题,还是想把表分开~
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

Djangomodels支持abstract=True属性,设置这个属性后,这个models不会在创建表,专门用来继承,具体的可以看官方文档ModelsAbstractbaseclasses部分.
Abstractbaseclasses
Abstractbaseclassesareusefulwhenyouwanttoputsomecommoninformationintoanumberofothermodels.Youwriteyourbaseclassandputabstract=TrueintheMetaclass.Thismodelwillthennotbeusedtocreateanydatabasetable.Instead,whenitisusedasabaseclassforothermodels,itsfieldswillbeaddedtothoseofthechildclass.Itisanerrortohavefieldsintheabstractbaseclasswiththesamenameasthoseinthechild(andDjangowillraiseanexception).
Anexample:
fromdjango.dbimportmodels
classCommonInfo(models.Model):
name=models.CharField(max_length=100)
age=models.PositiveIntegerField()
classMeta:
abstract=True
classStudent(CommonInfo):
home_group=models.CharField(max_length=5)
TheStudentmodelwillhavethreefields:name,ageandhome_group.TheCommonInfomodelcannotbeusedasanormalDjangomodel,sinceitisanabstractbaseclass.Itdoesnotgenerateadatabasetableorhaveamanager,andcannotbeinstantiatedorsaveddirectly.
                            
查看完整回答
反对 回复 2019-05-24
?
LEATH

TA贡献1936条经验 获得超6个赞

可以试试用继承
classPerson(models.Model):
classMeta:
db_table=table_name
app_label=table_name
title=models.CharField("title",max_length=300)
content=models.TextField("content",max_length=300)
classPerson2(Person):
classMeta:
db_table=table_name
app_label=table_name
或者使用元类去创建。
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号