一段代码如下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部分.AbstractbaseclassesAbstractbaseclassesareusefulwhenyouwanttoputsomecommoninformationintoanumberofothermodels.Youwriteyourbaseclassandputabstract=TrueintheMetaclass.Thismodelwillthennotbeusedtocreateanydatabasetable.Instead,whenitisusedasabaseclassforothermodels,itsfieldswillbeaddedtothoseofthechildclass.Itisanerrortohavefieldsintheabstractbaseclasswiththesamenameasthoseinthechild(andDjangowillraiseanexception).Anexample:fromdjango.dbimportmodelsclassCommonInfo(models.Model):name=models.CharField(max_length=100)age=models.PositiveIntegerField()classMeta:abstract=TrueclassStudent(CommonInfo):home_group=models.CharField(max_length=5)TheStudentmodelwillhavethreefields:name,ageandhome_group.TheCommonInfomodelcannotbeusedasanormalDjangomodel,sinceitisanabstractbaseclass.Itdoesnotgenerateadatabasetableorhaveamanager,andcannotbeinstantiatedorsaveddirectly.

LEATH
TA贡献1936条经验 获得超6个赞
可以试试用继承classPerson(models.Model):classMeta:db_table=table_nameapp_label=table_nametitle=models.CharField("title",max_length=300)content=models.TextField("content",max_length=300)classPerson2(Person):classMeta:db_table=table_nameapp_label=table_name或者使用元类去创建。
添加回答
举报
0/150
提交
取消