简单了解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的Django框架的运行方式及处理流程
Apr 08 Python
python黑魔法之编码转换
Jan 25 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
Python语言快速上手学习方法
Dec 14 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
python3实现点餐系统
Jan 24 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
linux下python中文乱码解决方案详解
Aug 28 Python
Python列表元素常见操作简单示例
Oct 25 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 Python
python 获取域名到期时间的方法步骤
Feb 10 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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
微信小程序动画(Animation)的实现及执行步骤
2018/10/28 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
python连接MySQL数据库实例分析
2015/05/12 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
python实现flappy bird游戏
2018/12/24 Python
Django中信号signals的简单使用方法
2019/07/04 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
高级人员简历的自我评价分享
2013/11/03 职场文书
汇源肾宝广告词
2014/03/20 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
《风筝》教学反思
2014/04/10 职场文书
护士个人年终总结
2015/02/13 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python