简单了解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中的字典遍历备忘
Jan 17 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
python实现将文本转换成语音的方法
May 28 Python
Java及python正则表达式详解
Dec 27 Python
对python3 urllib包与http包的使用详解
May 10 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
在Python中通过threshold创建mask方式
Feb 19 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 Python
Python实现石头剪刀布游戏
Jan 20 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP自定义函数收代码
2010/08/01 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
PHP中phar包的使用教程
2017/06/14 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
微信小程序实现轮播图效果
2017/09/07 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
详解python函数传参是传值还是传引用
2018/01/16 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
Python3爬楼梯算法示例
2019/03/04 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
办理暂住证介绍信
2014/01/11 职场文书
秋季运动会开幕词
2015/01/28 职场文书
z-index不起作用
2021/03/31 HTML / CSS
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技