在Django模型继承中,当一个抽象基类被设计完成后,它会将该基类中定义的Meta内部类以属性的形式提供给子类。另外,如果子类未定义自己的Meta类,那么它就会默认继承抽象基类的Meta类。
关于Meta类的继承,大致总结如下:
首先,子类如果要设置自己的Meta属性,则必须扩展抽象基类的Meta类。示例代码如下:
【代码3-16】
- 01 from django.db import models
- 02
- 03 class CommonInfo(models.Model):
- 04 # ...
- 05 class Meta:
- 06 abstract = True
- 07 ordering = ['name']
- 08
- 09 class StudentInfo(CommonInfo):
- 10 # ...
- 11 class Meta(CommonInfo.Meta): # 注意这里有个继承关系
- 12 db_table = 'student_info'
- 13 #...
- 14 pass
【代码分析】
在第03~07行代码中,定义了一个描述通用信息的抽象基类CommonInfo,具体内容说明如下:
在第09~14行代码中,定义了一个关于学生信息的子类StudentInfo,具体内容说明如下:
如前文所述,元数据属性db_table对抽象基类无效。首先,对于抽象基类本身而言,是不会创建数据表的;其次,所有子类也不会按照这个元数据属性来设置表名。
另外,如果想让一个抽象基类的子类也同样成为一个抽象基类,则必须显式地在该子类的Meta类中同样声明一个“abstract=True”属性。示例代码如下:
【代码3-17】
- 01 from django.db import models
- 02
- 03 class CommonInfo(models.Model):
- 04 # ...
- 05 class Meta:
- 06 abstract = True
- 07 ordering = ['name']
- 08
- 09 class UserInfo(CommonInfo):
- 10 # ...
- 11 class Meta(CommonInfo.Meta): # 注意这里有个继承关系
- 12 abstract = True
- 13 ordering = ['username']
- 14
- 15 class StudentInfo(UserInfo):
- 16 # ...
- 17 class Meta(UserInfo.Meta): # 注意这里有个继承关系
- 18 db_table = 'student_info'
- 19 #...
- 20 pass
【代码分析】
在第03~07行代码中,定义了一个描述通用信息的抽象基类CommonInfo,具体内容说明 如下:
在第15~20行代码中,定义了一个继承自抽象基类UserInfo的学生信息子类StudentInfo,具体内容说明如下:
最后,基于Python语法继承的工作机制,如果子类继承了多个抽象基类,则默认情况下仅继承第一个列出基类的Meta选项。如果要从多个抽象基类中继承Meta选项,则必须显式地声明Meta继承。示例代码如下:
【代码3-18】
- 01 from django.db import models
- 02
- 03 class CommonInfo(models.Model):
- 04 name = models.CharField(max_length=100)
- 05 age = models.PositiveIntegerField()
- 06
- 07 class Meta:
- 08 abstract = True
- 09 ordering = ['name']
- 10
- 11 class Unmanaged(models.Model):
- 12 class Meta:
- 13 abstract = True
- 14 managed = False
- 15
- 16 class StudentInfo(CommonInfo, Unmanaged):
- 17 home_group = models.CharField(max_length=5)
- 18
- 19 class Meta(CommonInfo.Meta, Unmanaged.Meta):
- 20 pass
- 21 #...
- 22 pass
【代码分析】
在第03~09行代码中,定义了第一个描述通用信息的抽象基类CommonInfo,具体内容说明如下:
在第11~14行代码中,定义了第二个抽象基类Unmanaged。在第12~14行代码中,在Meta类中添加了属性“abstract=True”,表明Unmanaged类为抽象基类。
在第16~20行代码中,定义了一个同时继承自抽象基类CommonInfo和Unmanaged的学生信息子类StudentInfo,具体内容说明如下:
本文节选自《Django 5企业级Web应用开发实战(视频教学版)》,获出版社和作者授权发布。