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中os和shutil模块实用方法集锦
May 13 Python
python使用BeautifulSoup分析网页信息的方法
Apr 04 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
python的scipy实现插值的示例代码
Nov 12 Python
python中数据库like模糊查询方式
Mar 02 Python
Django中ORM找出内容不为空的数据实例
May 20 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
如何用Django处理gzip数据流
Jan 29 Python
python中对列表的删除和添加方法详解
Feb 24 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
数据库的日期格式转换
2006/10/09 PHP
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP 模板高级篇总结
2006/12/21 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
Python中的元类编程入门指引
2015/04/15 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
网站域名和主机:Domain.com
2019/04/01 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
公司晚会主持词
2019/04/17 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
浅析Django接口版本控制
2021/06/26 Python