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实现探测socket和web服务示例
Mar 28 Python
Python中的super()方法使用简介
Aug 14 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python生成器的使用方法和示例代码
Mar 04 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
TensorFlow实现自定义Op方式
Feb 04 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 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
Protoss建筑一览
2020/03/14 星际争霸
php笔记之:AOP的应用
2013/04/24 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
2013/10/10 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Python 字符串定义
2009/09/25 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Python如何将模块打包并发布
2020/08/30 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
《长城和运河》教学反思
2014/04/14 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书