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 30 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
pytorch 自定义参数不更新方式
Jan 06 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
python如何导出微信公众号文章方法详解
Aug 31 Python
python里glob模块知识点总结
Jan 05 Python
python基于tkinter制作下班倒计时工具
Apr 28 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发送http请求的常用方法分析
2016/11/08 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
原生js实现验证码功能
2017/03/16 Javascript
几种响应式文字详解
2017/05/19 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
three.js实现圆柱体
2018/12/30 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
python计算时间差的方法
2015/05/20 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
社区服务标语
2014/07/01 职场文书
2014年销售部工作总结
2014/12/01 职场文书
病人慰问信范文
2015/02/15 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
校长一岗双责责任书
2015/05/09 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
JavaScript 对象创建的3种方法
2021/11/17 Javascript
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers