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选项有关,需要认真研究

    三.代理模型

    四.多继承

    

posted on 2015-10-18 12:33  chzb  阅读(1837)  评论(0)    收藏  举报

导航