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实现通过shelve修改对象实例
Sep 26 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
Python实现的彩票机选器实例
Jun 17 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
python hash每次调用结果不同的原因
Nov 21 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
Python random模块的使用示例
Oct 10 Python
python基于openpyxl生成excel文件
Dec 23 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 Python
Pytorch中的数据集划分&正则化方法
May 27 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
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
UserData用法总结 lanyu出品
2010/07/01 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
Python函数生成器原理及使用详解
2020/03/12 Python
python线性插值解析
2020/07/05 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
大学生求职信范文
2014/05/24 职场文书
物业品质提升方案
2014/06/08 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server