简单了解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 enumerate函数的使用方法总结
Nov 15 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
python pytest进阶之fixture详解
Jun 27 Python
django的csrf实现过程详解
Jul 26 Python
python numpy生成等差数列、等比数列的实例
Feb 25 Python
django列表筛选功能的实现代码
Mar 27 Python
python json.dumps中文乱码问题解决
Apr 01 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
python 制作网站筛选工具(附源码)
Jan 21 Python
python中的random模块和相关函数详解
Apr 22 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实现多图片上传类实例
2014/07/26 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
AJAX的使用方法详解
2017/04/29 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
动态加载js的几种方法
2006/10/23 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python使用udp实现聊天器功能
2018/12/10 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
前台接待岗位职责
2013/12/03 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python