简单了解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中readline判断文件读取结束的方法
Nov 08 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
python3调用R的示例代码
Feb 23 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python实现批量解析邮件并下载附件
Jun 19 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
Django-imagekit的使用详解
Jul 06 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 Python
python中对列表的删除和添加方法详解
Feb 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学习 函数 课件
2008/06/15 PHP
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
python二分法实现实例
2013/11/21 Python
基于python实现聊天室程序
2018/07/27 Python
python opencv读mp4视频的实例
2018/12/07 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
高中生自我鉴定范文
2013/10/30 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
演讲稿格式
2014/04/30 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
家访教师心得体会
2016/01/23 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js