简单了解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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
Python常用列表数据结构小结
Aug 06 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
python从入门到精通(DAY 1)
Dec 20 Python
windows系统下Python环境搭建教程
Mar 28 Python
Python使用asyncio包处理并发详解
Sep 09 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
详解Python 中的容器 collections
Aug 17 Python
python中spy++的使用超详细教程
Jan 29 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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
4.与数据库的连接
2006/10/09 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
javascript新手语法小结
2008/06/15 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python中关于字符串对象的一些基础知识
2015/04/08 Python
python实现PCA降维的示例详解
2020/02/24 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
竟聘演讲稿范文
2013/12/31 职场文书
新闻编辑求职信
2014/04/09 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android