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 相关文章推荐
Python3如何解决字符编码问题详解
Apr 23 Python
Python中的单继承与多继承实例分析
May 10 Python
Python实现求解一元二次方程的方法示例
Jun 20 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
学习python需要有编程基础吗
Jun 02 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
pandas 实现将NaN转换为None
May 14 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
Apr 13 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中uploaded_files函数使用方法详解
2011/03/09 PHP
php session安全问题分析
2011/06/24 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
javascript操作css属性
2013/12/30 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
酒吧创业计划书
2014/01/18 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
预备党员入党感想
2015/08/10 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python