django框架面向对象ORM模型继承用法实例分析


Posted in Python onJuly 29, 2019

本文实例讲述了django框架面向对象ORM模型继承用法。分享给大家供大家参考,具体如下:

Django ORM对模型继承的支持,将python面向对象的编程方法与数据库面向关系表的数据结构结合的很巧妙。支持三种风格的模型继承。

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

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

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

1.抽象基类继承举例如下:

from django.db import models
class Message(models.Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
  class Meta:
    abstract = True #证明该类是抽象基类
class Moment(Message):
  headline = models.CharField(max_length=50)
LEVELS = (
  ('1', 'Very Good'),
  ('2', 'Good'),
  ('3', 'Normal'),
  ('4', 'Bad'),
)
class Coment(Message):
  level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

抽象基类Message,用于保存消息的四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承Message,并且分别定义独有的一个地段。三个类映射到数据库,会被定义为两个数据表(抽象基类不在底层数据库中声称数据表):

数据表:app_Moment:app代表应用,包括id、user_name、content、pub_date和headline五个字段

数据表:app_Coment: 包括包括id、user_name、content、pub_date和level五个字段

2.多表继承

from django.db import models
class Message(models.Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
class Moment(Message):
  headline = models.CharField(max_length=50)
LEVELS = (
  ('1', 'Very Good'),
  ('2', 'Good'),
  ('3', 'Normal'),
  ('4', 'Bad'),
)
class Coment(Message):
  level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])

类Message,用于保存消息的四个字段:id、content、user_name和pub_date。子类Moment和Coment分别继承Message,并且分别定义独有的一个字段。三个类映射到数据库,会被定义为三个数据表:

数据表:app_Moment:app代表应用,包括id、user_name、content、pub_date和headline五个字段

数据表:app_Coment: 包括包括id、user_name、content、pub_date和level五个字段

数据表:app_Message:包括包括id、user_name、content、pub_date四个字段

多表继承时,在子类实例中可以通过小写的父类名字引用父类的实力

e.g:

al = Moment(xx, user_name="test")
print(al.message.user_name) #-------> test

3.代理模型继承

前两种继承模型中子类都有实际存储数据的作用,而代理模型继承父类的数据而不存储实际的数据,代理模型继承通过在子类的Meta类中定义proxy=True属性来实现:

from django.db import models
class Mement(models. Model):
  id    = models.AutoField(default=0)
  content  = models.CharField(max_length=100)
  user_name = models.CharField(max_length=80)
  pub_date = models.DateField()
class OrderByMoment(Moment): #使用代理模型继承的原因是子类中新的特性不会影响父类的模型及其已有代码的行为
  class Meta:
    proxy  = True
    ordering = ['-pub_date']  #Moment根据pub_date倒序排列

Moment类用于存储数据,OrderByMoment类用于管理根据pub_date倒序排列的Moment

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python 错误和异常小结
Oct 09 Python
使用Python的Zato发送AMQP消息的教程
Apr 16 Python
Python第三方库的安装方法总结
Jun 06 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 Python
Python基本的内置数据类型及使用方法
Apr 13 Python
Python使用pyecharts控件绘制图表
Jun 05 Python
Python将string转换到float的实例方法
Jul 29 #Python
django foreignkey(外键)的实现
Jul 29 #Python
python实现翻转棋游戏(othello)
Jul 29 #Python
Django如何将URL映射到视图
Jul 29 #Python
python3获取当前目录的实现方法
Jul 29 #Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 #Python
Django框架创建mysql连接与使用示例
Jul 29 #Python
You might like
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
Ruby如何实现动态方法调用
2012/11/18 面试题
化工专业大学生职业生涯规划书
2014/01/14 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
会计工作总结范文2014
2014/12/23 职场文书
毕业论文致谢词
2015/05/14 职场文书
Python数据类型最全知识总结
2021/05/31 Python
为Centos安装指定版本的Docker
2022/04/01 Servers
Golang 链表的学习和使用
2022/04/19 Golang