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异常处理慎用“except:pass”建议
Apr 02 Python
Python中的map()函数和reduce()函数的用法
Apr 27 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Django进阶之CSRF的解决
Aug 01 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
python画双y轴图像的示例代码
Jul 07 Python
python定时任务 sched模块用法实例
Nov 04 Python
Python装饰器原理与基本用法分析
Jan 07 Python
pytorch 修改预训练model实例
Jan 18 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 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下使用以下代码连接并测试
2008/04/09 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
Vuex 入门教程
2018/01/10 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python生成带有表格的图片实例
2019/02/03 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
大学生饮食配送创业计划书
2014/01/04 职场文书
中学教师请假制度
2014/02/03 职场文书
给老婆的保证书范文
2014/04/28 职场文书
中专生自荐信
2014/06/25 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
教你怎么用Python操作MySql数据库
2021/05/31 Python