您的位置:首页 > 编程语言 > Go语言

Django官方文档Model层之继承

2015-10-18 12:33 323 查看
[b]模型继承[/b]

  一.抽象基类继承

    抽象基类:

    抽象基类主要是作为一个信息集合,用在许多模型拥有共同信息的场合,本质上只是一个存储信息的容器,数据库中不创建表结构,不能单独使用,子类通过继承来获得父 亲基类的字段和元类型数据,通过设置Meta类的abstract=True属性来声明为抽象基类,否则,不会自动变为抽象基类,现举例如下:

      

from django.db import models

class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()

class Meta:
abstract = True      #声明为抽象基类

class Student(CommonInfo):   #继承了基类的字段属性
home_group = models.CharField(max_length=5)


    属性继承:内部元类Meta

    若子类没有声明自己的内部元类,它会继承父类的Meta属性,若子类想要使用扩展父类的Meta属性,可以子类化父基类的Meta属性,举例如下:

 

from django.db import models

class CommonInfo(models.Model):
# ...
class Meta:
abstract = True
ordering = ['name']

class Student(CommonInfo):
# ...
class Meta(CommonInfo.Meta):        #子类化父亲的Meta属性
db_table = 'student_info'


    抽象基类外键多对多关系字段中的related_name选项的注意事项:

    理解的有点模糊,待写。

  二.多表格继承

    parent和child每一个模型都是一个独立的模型,都占用数据库表格,他们之间通过一个自动创建的OneToOne字段进行链接,举例如下:

    

from django.db import models

class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)

class Restaurant(Place):       #继承
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)


     属性:父亲内部Meta类

       子模型继承父亲的内部Meta类没有意义,所有的Meta属性都应用到了父亲模型中,再次在子模型中应用Meta类会引起冲突行为。因此一个子模型不访问父亲的Meta类属性,有一些例外,例如:ordering和get_lasted_by可以在子模型中进行设置

class ChildModel(ParentModel):
# ...
class Meta:
# 清除父亲的排序效果
ordering = []


      继承和反向查找:当涉及到外键和多对多字段时与模型的related_names选项有关,需要认真研究

    三.代理模型

    四.多继承

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: