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输出指定月份日历的方法
Apr 23 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
详谈python在windows中的文件路径问题
Apr 28 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
django框架自定义用户表操作示例
Aug 07 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python 用opencv调用训练好的模型进行识别的方法
Dec 07 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
用opencv给图片换背景色的示例代码
Jul 08 Python
python自动计算图像数据集的RGB均值
Jun 18 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代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
jQuery插件开发基础简单介绍
2013/01/07 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
SQL数据库笔试题
2016/03/08 面试题
大学生标准推荐信范文
2013/11/25 职场文书
办理退休介绍信
2014/01/09 职场文书
面试自我评价范文
2014/09/17 职场文书
劳模先进事迹材料
2014/12/24 职场文书
十岁生日答谢词
2015/01/05 职场文书
新课程改革心得体会
2016/01/22 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers