django支持三种风格的模型继承:

1. 抽象类继承: 父类继承自models.Model, 但不会在数据库中生成相应的数据表。父类的属性列存储在其子类的数据表中

2. 多表继承: 多表继承的每个类都在数据库中生成相应的数据表管理数据

3. 代理模型继承: 父类用于在数据库中管理数据表, 子类不定义数据列,只定义查询的数据集的排序方式等元数据

抽象类继承

抽象类继承的作用是在多个表中有若干相同字段时,可以将这些字段统一定义在抽象基类中,免于重复定义这些字段

from django.db import models

class MessageBase(models.Model):
id = models.AutoField()
content = models.CharField(max_length=100)
user_name = models.CharField(max_length=80)
pub_date = models.DateField() class Meta:
abstract = True #定义本类为抽象类 class Moment(MessageBase):
headline = models.CharField(max_length=50) LEVELS = (
('1', 'Very Good'),
('2', 'Good'),
('3', 'Normal'),
('4', 'Bad'),
) class Comment(MessageBase):
level = models.CharField(max_length=1, choices=LEVELS)

映射到数据库后,会建立两个数据表

moment:   字段有 id, content, user_name, pub_date, headline

comment:  字段有id, content, user_name, pub_date, level

多表继承

在多表继承中,无论是父表还是子表都会用数据库中对应的数据表维护模型数据;父类的字段不会重复地在多个子类的数据表中定义

from django.db import models

class MessageBase(models.Model):
id = models.AutoField()
content = models.CharField(max_length=100)
user_name = models.CharField(max_length=80)
pub_date = models.DateField() class Moment(MessageBase):
headline = models.CharField(max_length=50) class Comment(MessageBase):
level = models.CharField(max_lenght=1, choices=LEVELS)

数据库中实际会生成3个数据表:

MessageBase:   字段有 id, content, user_name, pub_date

Moment: 字段有 id, headline

Comment: 字段有 id, level

而在实际应用 中,子类仍然可以直接引用父类定义的字段, 同时子类可以通过父类对象引用访问父类实例

m1 = Moment(user_name='Terry', headline='Hello World')
m1.content = "reference parent field in subclass"
m1.save() print m1.messagebase.content #通过小写的父类名可以引用父类的实例

代理模型继承

代理模型中的子类只用于管理父类的数据,而不实际存储数据;代理模型继承通过在子类的Meta中定义proxy=True实现

from django.db import models

class Moment(models.Model):
id = models.AutoField()
headline = models.CharField(max_lenght=50)
content = models.CharField(max_lenght=100)
user_name = models.CharField(max_lenght=80)
pub_date = models.DateField() class OrderedMoment(Moment):
class Meta:
proxy = True
ordering = ["-pub_date"]

父类模型用于存储数据,子类模型用于管理根据Pub_date倒序排序。  这样子类中的新特性,不会影响父类模型及其已有的代码。

Django 面向对象orm的更多相关文章

  1. Django之ORM基础

    ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  2. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  3. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  4. day 67 django 之ORM 基础安装

    一 ORM的基础部分 1 ORM的概念 对象关系映射(Object Relational Mapping(映射),简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 2   ...

  5. 九、Django之ORM

    一.ORM概述 用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作. 到目前为止,当我们的程序涉及到数据库相关操作时,一般操作流 ...

  6. Django基础——ORM字段和字段参数

    ORM概念: 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象( 1. 不同的程序员写的SQL水平参差不齐 2. ...

  7. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  8. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  9. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

随机推荐

  1. jQuery-contextMenu使用教程

    jQuery-contextMenu使用教程 效果如下图所示.在[右击菜单]处右击,会出现下面的效果. 添加引用 <script src="jQuery-contextMenu-mas ...

  2. Linux Samba服务主配文件smb.conf中文详解【转】

    转自:https://blog.csdn.net/maotianwang/article/details/52524732 从网上找到描述比较详细的smb.conf中文解释: 服务名:smb 配置目录 ...

  3. Delphi中的动态包,有详细建立包的步骤(答案很简单:因为包的功能强大)

    为什么要使用包? 答案很简单:因为包的功能强大.设计期包(design-time package)简化了自定义组件的发布和安装:而运行期包(run-time package)则更是给传统的程序设计注入 ...

  4. PNG,JPEG,BMP,JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...

  5. java注解优缺点

    优点: 1.节省配置,减少配置文件大小 2.编译时即可查看正确与否,提高效率 缺点: 1.增加了程序的耦合性,因为注解保存在class文件中,而且比较分散 2.若要对配置进行修改需要重新编译 @aut ...

  6. openwrt git 代码下载地址

    openwrt 各个版本代码下载 trunk:git clone git://github.com/openwrt/openwrt.git 15.05  (Chaos Calmer)git clone ...

  7. PL/SQL第四章 where子语句

    -- 学习where语句 -- 1.学会where子句中使用常规比较符 -- 常规比较操作符:=,<>(不等于),!=,>=,<=,>,< -- 当区分大小写时,可 ...

  8. java比较两个对象是否相等?

    1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象(java中如果两对象(obj1,obj2)相等,那么在修改obj2的时候,ob ...

  9. RHEL7 配置iSCSI模拟环境

    在之前文章<multipath多路径实验01-构建iSCSI模拟环境>中,已经介绍了如何构建iSCSI模拟环境(RHEL6),但在RHEL7中已经不适用,本文记录下新的配置方法. 环境:R ...

  10. Range:HTML5中的新型Input类型

    <div style="width:100%; height:100%; position:fixed; top:0; left:0; z-index:100000; backgrou ...