简单了解Django ContentType内置组件


Posted in Python onJuly 23, 2019

一、引出问题

简单了解Django ContentType内置组件

假如有这两张表,它们中的课程可能价格不一样、周期不一样、等等...不一样...,现在有一张价格策略表,怎么就用一张表报保存它们之间不同的数据呢?

可能你会这样:

简单了解Django ContentType内置组件

确实是行!但是,如果有很多不同类型的课程,那么这样表就太多空值了!

没办法,这一张表不行,再创建一张不就行了,就像这样:

简单了解Django ContentType内置组件

确实,对于这种情况,Django就是这样做的。

现在,有了 ContentType,我们只需创建三张表,就实现跟上面的效果一模一样了。

这是因为 Django 本身就会新建 django_content_type 这张表,这张表就保存了 model 中的表名。

简单了解Django ContentType内置组件

二、ContentType

那么怎么创建这种关系呢?如下:

简单了解Django ContentType内置组件

这里,DegreeCourse 表没有使用 GenericRelation,则不能使用下面说的第3点,否则报错,要想使用就跟 Course 表一样添加即可。

对于 GenericRelation 和 GenericForeignKey 类型字段,不会在数据库生成列!

三、测试

# views.py
from django.shortcuts import HttpResponse
from django.contrib.contenttypes.models import ContentType
from appxx import models

1、在价格策略表中添加一条数据。

# 方式1
def test(request):
  models.PricePolicy.objects.create(
    price=100,
    valid_period=7,
    object_id=3,
    content_type=ContentType.objects.get(model="course")
  )
  return HttpResponse("ok")
# 方式2
def test(request):
  models.PricePolicy.objects.create(
    price=200,
    valid_period=14,
    content_object=models.Course.objects.get(id=3) # 对应Course表id为3的价格策略
    # content_object=models.DegreeCourse.objects.get(id=2) # 对应DegreeCourse表id为2的价格策略
  )
  return HttpResponse("ok")

2、 根据某个价格策略对象,找到对应的表和数据。(是根据 GenericForeignKey类型字段实现的)

def test(request):
  obj = models.PricePolicy.objects.get(id=1)
  print(obj.content_object.id, obj.content_object.name) # 自动找到
  return HttpResponse("ok")

3、 找到某个课程关联的所有价格策略。(是根据 GenericRelation 类型字段实现的)

def test(request):
  obj = models.Course.objects.get(id=1)
  for item in obj.policy_list.all():
    print(item.id, item.price, item.valid_period)
  return HttpResponse("ok")

关系图:

简单了解Django ContentType内置组件

四、总结

什么时候才用ContentType?

当一张表跟 n 张表动态地创建 ForeignKey 关系时,而不是创建太多列,因为数据表中会有很多空值。

ContentType 通过仅两列字段就实现了 n 张表的 ForeignKey 关系。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中Iterator迭代器的使用杂谈
Jun 20 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
Django组件之cookie与session的使用方法
Jan 10 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
Python编程中类与类的关系详解
Aug 08 Python
学python安装的软件总结
Oct 12 Python
PyTorch中的Variable变量详解
Jan 07 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
使用python实现名片管理系统
Jun 18 Python
Pytorch实验常用代码段汇总
Nov 19 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 #Python
python设计tcp数据包协议类的例子
Jul 23 #Python
Django 缓存配置Redis使用详解
Jul 23 #Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 #Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
You might like
php分页函数示例代码分享
2014/02/24 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
基于jquery的表格排序
2010/09/11 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
什么是.net
2015/08/03 面试题
环保建议书500字
2014/05/14 职场文书
欢迎领导检查标语
2014/06/27 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
英语辞职信范文
2015/02/28 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技