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爬虫获取多页天涯帖子
Feb 23 Python
Python设计模式之策略模式实例详解
Jan 21 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
Django模板语言 Tags使用详解
Sep 09 Python
pytorch 自定义参数不更新方式
Jan 06 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
Python 解析简单的XML数据
Jul 24 Python
Python selenium实现断言3种方法解析
Sep 08 Python
selenium如何定位span元素的实现
Jan 13 Python
Python Matplotlib绘制动画的代码详解
May 30 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python爬虫超时的处理的实例
2018/12/19 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
科研先进个人典型材料
2014/01/31 职场文书
《钱学森》听课反思
2014/03/01 职场文书
法人代表授权委托书
2014/04/08 职场文书
北京故宫导游词
2015/01/31 职场文书
卡特教练观后感
2015/06/08 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
Java实现带图形界面的聊天程序
2022/06/10 Java/Android