简单了解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异常处理慎用“except:pass”建议
Apr 02 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
Python应用库大全总结
May 30 Python
python 美化输出信息的实例
Oct 15 Python
使用Python 统计高频字数的方法
Jan 31 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python多维数组分位数的求取方式
Mar 03 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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中echo,print_r与var_dump区别分析
2014/09/29 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
python插入数据到列表的方法
2015/04/30 Python
Python操作串口的方法
2015/06/17 Python
Python操作MongoDB详解及实例
2017/05/18 Python
PyQT实现多窗口切换
2018/04/20 Python
python简单操作excle的方法
2018/09/12 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
护士的岗位职责
2013/12/04 职场文书
物理教师自荐信范文
2013/12/28 职场文书
留学推荐信中文范文
2015/03/26 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python