django inheritance

Abstract base classes

在元数据中设置Meta中设置 abstract=True ,这个model将用于创建任何数据表.当它被作为基类时.他的字段添加进这些子类当中,
注意:
1.如果抽象类和基类有相同名称的字段会产生一个异常.
2.基类不会产生一个数据表或者生成一个管理器,也不能被直接实例化调用.

from django.db import models
class Base(models.Model): 
        m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")
        class Meta: 
                abstract = True
class ChildA(Base):
       pass
class ChildB(Base): 
        pass

Meta inheritance
django允许声明各种meta属性,如果子类没有声明,他将自动继承父类的,也可以继承然后扩展

class Meta(father_class.Meta):
       db_table = 'child_info'

db_table将意味着所有的子类(那些没有指定自己的Meta)将使用同一数据库,这肯定不会是你想要的。

Multi-table inheritanceDjango支持的第二种model继承是多表继承,在继承结构中每个model都是独立的。都对应着自己的数据库表,可以进行独立的查询等操作。继承关系实际是子model和每个父model之间的关系(通过自动创建OneToOneField)

from django.db import model
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)

所有Place的字段都可以在Restaurant中使用,虽然数据存放在不同的数据表中

Proxy models
当使用多表继承时一个新的数据表model会在每一个子类中创建,这是因为子model需要存储父mdoel不存在的一些数据字段。但有时只需要改变model的操作行为,可能是为了改变默认的管理行为或添加新的方法。

这时就应该使用代理模式的继承:创建原始model的代理。你可以创建一个用于 create, delete 和 update的代理model,使用代理model的时候数据将会真实保存。这和使用原始model是一样的,所不同的是当你改变model操作时,不需要去更改原始的model。

代理模式的声明和正常的继承声明方式一样。你只需要在Meta class 中定义proxy为True就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.c...
    罗田阅读 31,100评论 2 42
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,848评论 18 399
  • 清明雨纷纷的时节已经过去一段时间了,品茶、送茶叶的热度还居高不下。我不懂茶道,不识茶叶的品相贵贱,但明前茶却对我别...
    馋馋阅读 712评论 0 5
  • 关于《非暴力沟通》第十二章重获生活热情 1.为什么许多人难以倾听和表达自己需要? 我们的文化倾向把个人需要看作是消...
    思维导图贺姝琴猪猪阅读 611评论 0 2