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 Queue模块详细介绍及实例
Dec 27 Python
Python编程求质数实例代码
Jan 31 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
使用python实现简单五子棋游戏
Jun 18 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
Django中的cookie和session
Aug 27 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python 发送json数据操作实例分析
Oct 15 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
七个Python必备的GUI库
Apr 27 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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/09/28 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
Python的互斥锁与信号量详解
2019/09/12 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
ktv筹备计划书
2014/05/03 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
工作证明英文模板
2014/10/21 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
立项申请报告范本
2015/05/15 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server