简单了解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多维/嵌套字典数据无限遍历的实现
Nov 04 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Python同时迭代多个序列的方法
Jul 28 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 Python
Pandas DataFrame求差集的示例代码
Dec 13 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
如何用python绘制雷达图
Apr 24 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 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
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
解析php取整的几种方式
2013/06/25 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python装饰器实例大详解
2017/10/25 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
创立科技Java面试题
2015/11/29 面试题
给全校老师的建议书
2014/03/13 职场文书
化学教育专业自荐信
2014/07/04 职场文书
机电一体化专业求职信
2014/07/22 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
个人售房合同协议书
2016/03/21 职场文书