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使用calendar输出指定年份全年日历的方法
Apr 04 Python
在Python的Flask框架中实现单元测试的教程
Apr 20 Python
Python基本语法经典教程
Mar 11 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
python通过链接抓取网站详解
Nov 20 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
Python jieba库分词模式实例用法
Jan 13 Python
python实现杨辉三角的几种方法代码实例
Mar 02 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编写批量生成不重复的卡号密码代码
2015/05/14 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
使用npm安装最新版本nodejs
2018/01/18 NodeJs
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
2018/10/29 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
如何查找和删除数据库中的重复数据
2014/11/05 面试题
临床医学应届生求职信
2013/11/06 职场文书
教育局长自荐信范文
2013/12/22 职场文书
森林防火标语
2014/06/23 职场文书
大学生求职信例文
2014/06/29 职场文书
毕业证委托书范文
2014/09/26 职场文书
民主生活会剖析材料
2014/09/30 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python