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 26 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
python爬虫库scrapy简单使用实例详解
Feb 10 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
python 爬虫如何正确的使用cookie
Oct 27 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
Pytorch 如何实现LSTM时间序列预测
May 17 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
初学Javascript的一些总结
2008/11/03 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
jQuery 表单验证扩展代码(二)
2010/10/20 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python数据分析库pandas基本操作方法
2018/04/08 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
Python-for循环的内部机制
2020/06/12 Python
Python过滤序列元素的方法
2020/07/31 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
庆八一活动方案
2014/01/25 职场文书
滞留工资返还协议书
2014/10/19 职场文书
计划生育汇报材料
2014/12/26 职场文书
企业培训简报范文
2015/07/20 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
详解Django的MVT设计模式
2021/04/29 Python
在redisCluster中模糊获取key方式
2021/07/09 Redis
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers