简单了解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学习笔记 下载
Feb 10 Python
使用python实现tcp自动重连
Jul 02 Python
python使用Tesseract库识别验证
Mar 21 Python
python 显示数组全部元素的方法
Apr 19 Python
Python中flatten( )函数及函数用法详解
Nov 02 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
Python当中的array数组对象实例详解
Jun 12 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
python如何使用代码运行助手
Jul 03 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
小谈angular ng deploy的实现
2020/04/07 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Windows下安装python2.7及科学计算套装
2015/03/05 Python
浅析Python多线程下的变量问题
2015/04/28 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
django使用channels实现通信的示例
2020/10/19 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
MySQL开启事务的方式
2021/06/26 MySQL