简单了解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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Python生成随机密码的方法
Jun 16 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
使用python绘制二元函数图像的实例
Feb 12 Python
用python做游戏的细节详解
Jun 25 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
Python双链表原理与实现方法详解
Feb 22 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 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与SQL注入攻击[二]
2007/04/17 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript字符串拼接的效率问题
2010/12/25 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
Django forms表单 select下拉框的传值实例
2019/07/19 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
计算机本科生自荐信
2013/10/15 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
市场部岗位职责
2015/02/12 职场文书
世界文化遗产导游词
2015/02/13 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
小学六年级毕业感言
2015/07/30 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
52条SQL语句教你性能优化
2021/05/25 MySQL
Python编解码问题及文本文件处理方法详解
2021/06/20 Python
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers