简单了解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 isinstance判断对象类型
Sep 06 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
Python内置函数locals和globals对比
Apr 28 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
浅析python函数式编程
Sep 26 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Python安装pycurl失败的解决方法
2018/10/15 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
创业计划书——互联网商机
2014/01/12 职场文书
市场营销求职信范文
2014/02/21 职场文书
献爱心标语
2014/06/21 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
法律讲堂观后感
2015/06/11 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis