简单了解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中的二维数组的操作方法
May 02 Python
Python对文件操作知识汇总
May 15 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
python中pika模块问题的深入探究
Oct 13 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
pandas的resample重采样的使用
Apr 24 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 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
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
Vue axios设置访问基础路径方法
2018/09/19 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
对pandas中to_dict的用法详解
2018/06/05 Python
Series和DataFrame使用简单入门
2019/11/13 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
实习老师个人总结的自我评价
2013/09/28 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
测绘工程系学生的自我评价
2013/11/30 职场文书
个人自我鉴定写法
2013/11/30 职场文书
旷课检讨书大全
2014/01/21 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript