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写的一个squid访问日志分析的小程序
Sep 17 Python
python实现可将字符转换成大写的tcp服务器实例
Apr 29 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
python使用turtle绘制分形树
Jun 22 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
keras的load_model实现加载含有参数的自定义模型
Jun 22 Python
通过实例简单了解python yield使用方法
Aug 06 Python
解决python3安装pandas出错的问题
May 20 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 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.ini 中文版
2006/10/28 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
javascript 日期常用的方法
2009/11/11 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Python中如何获取类属性的列表
2016/12/26 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
python文件选择对话框的操作方法
2019/06/27 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
QA工程师岗位职责
2013/11/20 职场文书
教师个人鉴定材料
2014/02/08 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python
Nginx安装配置详解
2022/06/25 Servers