Django官方文档Model层之继承
模型继承
一.抽象基类继承:
抽象基类:
抽象基类主要是作为一个信息集合,用在许多模型拥有共同信息的场合,本质上只是一个存储信息的容器,数据库中不创建表结构,不能单独使用,子类通过继承来获得父 亲基类的字段和元类型数据,通过设置Meta类的abstract=True属性来声明为抽象基类,否则,不会自动变为抽象基类,现举例如下:
1 from django.db import models 2 3 class CommonInfo(models.Model): 4 name = models.CharField(max_length=100) 5 age = models.PositiveIntegerField() 6 7 class Meta: 8 abstract = True #声明为抽象基类 9 10 class Student(CommonInfo): #继承了基类的字段属性 11 home_group = models.CharField(max_length=5)
属性继承:内部元类Meta
若子类没有声明自己的内部元类,它会继承父类的Meta属性,若子类想要使用扩展父类的Meta属性,可以子类化父基类的Meta属性,举例如下:
1 from django.db import models 2 3 class CommonInfo(models.Model): 4 # ... 5 class Meta: 6 abstract = True 7 ordering = ['name'] 8 9 class Student(CommonInfo): 10 # ... 11 class Meta(CommonInfo.Meta): #子类化父亲的Meta属性 12 db_table = 'student_info'
抽象基类中外键和多对多关系字段中的related_name选项的注意事项:
理解的有点模糊,待写。
二.多表格继承
parent和child每一个模型都是一个独立的模型,都占用数据库表格,他们之间通过一个自动创建的OneToOne字段进行链接,举例如下:
1 from django.db import models 2 3 class Place(models.Model): 4 name = models.CharField(max_length=50) 5 address = models.CharField(max_length=80) 6 7 class Restaurant(Place): #继承 8 serves_hot_dogs = models.BooleanField(default=False) 9 serves_pizza = models.BooleanField(default=False)
属性:父亲内部Meta类
子模型继承父亲的内部Meta类没有意义,所有的Meta属性都应用到了父亲模型中,再次在子模型中应用Meta类会引起冲突行为。因此一个子模型不访问父亲的Meta类属性,有一些例外,例如:ordering和get_lasted_by可以在子模型中进行设置
1 class ChildModel(ParentModel): 2 # ... 3 class Meta: 4 # 清除父亲的排序效果 5 ordering = []
继承和反向查找:当涉及到外键和多对多字段时与模型的related_names选项有关,需要认真研究。
三.代理模型
四.多继承
浙公网安备 33010602011771号