简单了解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代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
python使用tornado实现简单爬虫
Jul 28 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 Python
Python Django ORM连表正反操作技巧
Jun 13 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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
解析php中curl_multi的应用
2013/07/17 PHP
thinkphp框架下404页面设置 仅三步
2016/05/14 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
Javascript实现的分页函数
2006/12/22 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
python实现连接mongodb的方法
2015/05/08 Python
Python lxml模块安装教程
2015/06/02 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技
Python实现对齐打印 format函数的用法
2022/04/28 Python