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. typedef 用法总结

    原文转自:http://www.cnblogs.com/ggjucheng/archive/2011/12/27/2303238.html 引言 typedef 声明,简称 typedef,为现有类型 ...

  2. 使用 GDebi 默认代替 Ubuntu 软件中心

    GDebi,一个安装 Debian 可执行文件的专用程序.它极其轻量,且专注于安装 .deb 文件,可以自动解决依赖问题,比原生的好用.GDebi 最有用的功能是它也可以为你展示出将要安装的程序的依赖 ...

  3. VirtualBox上的Ubuntu附加功能

    主机:Windows 10家庭中文版,VirtualBox 版本 5.2.22 r126460 (Qt5.6.2),Ubuntu 18.04, 在主机上安装了VirtualBox,然后在Virtual ...

  4. Gradient Domain Guided Image Filtering(梯度域导向滤波)

    作者提出了一种新的梯度域引导图像滤波器,通过将明确的一阶边缘感知约束结合到现有的引导图像滤波器中. matlab代码实现 转载至:https://blog.csdn.net/majinlei121/a ...

  5. Spatial Transformer Networks

    参考:http://blog.csdn.net/xbinworld/article/details/69049680 论文的关键在理解这句话: 先通过V中坐标(xtarget,ytarget)以此找到 ...

  6. node调试工具--nodemon

  7. 深度学习Bible学习笔记:第六章 深度前馈网络

    第四章 数值计算(numerical calculation)和第五章 机器学习基础下去自己看. 一.深度前馈网络(Deep Feedfarward Network,DFN)概要: DFN:深度前馈网 ...

  8. PHP对Url中的汉字进行编码和解码

    有的新手朋友们对于url编码解码这个概念,或许有点陌生.但是如果这么说,当我们在浏览各大网页时,可能发现有的url里有一些特殊符号比如#号,&号,_号或者汉字等等,那么为了符合url的规范,存 ...

  9. PHP 闭包

    一.闭包基本用法闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数.比如下面的例子: // 定义一个闭包,并把它赋给变量 $f $f = function () { return 7; } ...

  10. SPOJ - MATSUM 二维树状数组单点更新

    忘记了单点更新时要在树状数组中减去原值..wa了一发 /* 矩形求和,单点更改 */ #include<iostream> #include<cstring> #include ...