Django的contenttypes
这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系。

比如说有两种不同课程,这两种课程都有价格周期和策略。如果最低级的则是给每个表创建一个价格策略。如果非要在同一个表内使用价格策略,
那么如上图那样,course_id跟专题课程做外键关联,学位课程为空,如果跟学位课程做关联,那么专题课程的ID又为空,如果很多门课程,那么
就需要在价格策略中写入很多的外键字段。
为了解决这种问题,django引入了一种方式就是django的contenttypes。
首先有下面的表结构:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class DegreeCourse(models.Model):
"""学位课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255, verbose_name="缩略图")
brief = models.TextField(verbose_name="学位课程简介", ) class Course(models.Model):
"""专题课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255) # 不会在数据库生成列,只用于帮助你进行查询
policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model):
"""价格与有课程效期表"""
content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE) # 关联course or degree_course
object_id = models.PositiveIntegerField() #不会在数据库生成列,只用于帮助你进行添加和查询
content_object = GenericForeignKey('content_type', 'object_id') valid_period_choices = (
(1, '1天'),
(3, '3天'),
(7, '1周'), (14, '2周'),
(30, '1个月'),
(60, '2个月'),
(90, '3个月'),
(180, '6个月'), (210, '12个月'),
(540, '18个月'), (720, '24个月'),
)
valid_period = models.SmallIntegerField(choices=valid_period_choices)
price = models.FloatField()
这种结构就相当于下图:

另外建立一个表,存放表名称。
然后在价格策略表中放2个字段,一个字段就是表名,一个就是这个表中第几个数据。
比如course表中第一个数据21天入门。
表结构分析:
content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE) # 关联course or degree_course
object_id = models.PositiveIntegerField() #这个就是课程表内有多少课程,这个约束不了,只能是个正整数。

最后就是查询和增加的测试!
from django.shortcuts import render,HttpResponse
from app01 import models
from django.contrib.contenttypes.models import ContentType def test(request):
# 1.在价格策略表中添加一条数据
# models.PricePolicy.objects.create(
# valid_period=7,
# price=6.6,
# content_type=ContentType.objects.get(model='course'), #外键关联到这个表
# object_id=1
# )
#使用神奇的字段创建
# models.PricePolicy.objects.create(
# valid_period=14,
# price=9.9,
# content_object=models.Course.objects.get(id=1) #这样得到就是Course表,而且id是1,这两个。自动帮你添加这两个值。
# )
# 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
# price = models.PricePolicy.objects.get(id=2) #ID为2的这条价格策略对象
# print(price.content_object.name) # 关联的是专题课程,想要显示专题课程的名称 21天入门
# 3.找到某个课程关联的所有价格策略 数据库中加这个 policy_list=GenericRelation("PricePolicy")
# obj = models.Course.objects.get(id=1)
# for item in obj.policy_list.all():
# print(item.id,item.valid_period,item.price) #
#
return HttpResponse('...')
加的两个字段使用的关系以及使用django.content-type表的使用:

不仅是价格策略,优惠券也会使用这个,比如2种类型的课程,买第一种课程的有优惠券,买第二种课程还可能有优惠券。
Django的contenttypes的更多相关文章
- 「Django」contenttypes基本用法
当一张表和多个表ForeignKey关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes,只需定义三个字段就搞定! contenttypes 是Django内置的一个应用 ...
- Django之contenttypes的应用
Django contenttypes 应用 简介 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我 ...
- Django的contenttypes应用、缓存相关
一.django的contenttypes contenttypes 是Django内置的一个应用 , 可以追踪项目中所有app 和 model 的对应关系, 并记录djang_content_typ ...
- Django之ContentTypes
ContentTypes是什么? ContentTypes是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建了新的mode ...
- Django应用之content type(app应用之一django.contrib.contenttypes)
当一张表作为多个表的FK(主键),并且只能选择其中一个或者几个时,就可以使用content_type表:例如下图的数据关系,因此就可以使用content_type表来将表与表中的对象进行关联,从而做到 ...
- Django之contenttypes组件
目录 一. 介绍 二. 应用场景 1. 表结构设计的演变 2. GenericForeignKey和GenericRelation 3. 测试 一. 介绍 Django包含一个contenttypes ...
- Django contenttypes 组件
contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...
- Django contenttypes组件
contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...
- Django contenttypes 应用
Django contenttypes 应用 什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Dja ...
随机推荐
- 使用Navicat for Mysql连接mysql服务器
使用Navicat for Mysql连接mysql服务器 在windows上用Navicat for Mysql 连接装在虚拟机Ubuntu上的mysql服务器时出现的问题的解决方案. Navica ...
- Linux文件管理命令 cat
1.cat 命令:将文件内容连接后传送到标准输出或重定向到文件. 1)命令语法格式:cat [OPTION] [FILE]... 2)命令选项参数说明如下所示. -n(number):从第一行开始对文 ...
- centOS7docker安装oracle
1.拉取oracle 11g 的镜像: 用root登陆服务器,输入下面的命令,拉取oracle 11g的镜像,有点大,6.8G多: docker pull registry.cn-hangzhou.a ...
- 4.9Python数据处理篇之Matplotlib系列(九)---子图分布
目录 目录 前言 (一)subplot()方法 ==1.语法说明== ==2.源代码== ==3.输出效果== (二)subplot2grid方法 ==1.语法说明== ==2.源代码== ==3.展 ...
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)转载自码农网
CentOS 是一个工业标准的 Linux 发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...
- centos7下安装docker(18.2docker日志---ELK)
ELK是三个软件得组合:Elasticsearch,Logstash,Kibana Elasticsearch:实时查询的全文搜索引擎.Elasticsearch的设计目的就是能够处理和搜索巨量的日志 ...
- RocketMQ实现事务消息
在RocketMQ4.3.0版本后,开放了事务消息这一特性,对于分布式事务而言,最常说的还是二阶段提交协议,那么RocketMQ的事务消息又是怎么一回事呢,这里主要带着以下几个问题来探究一下Rocke ...
- CF817F MEX Queries
嘟嘟嘟 这题一直在我的某谷任务计划里,不知为啥一直没做. 现在看起来很水啊,就是离散化+线段树.可能是当时没想明白怎么离散化吧. 就是先把算有区间端点都离线下来,然后把\(l - 1, l, l + ...
- 【angularjs】使用ionic+angular 搭建移动端项目,字体适配
解析: 首先,rem是以html为基准. 一般的,各大主流浏览器的font-size默认值为16px,此时1rem=16px.如果此时将rem与px进行换算很麻烦,比如0.75rem=12px. 为了 ...
- 五、Oracle 分组查询、视图
一.分组函数1.avg:平均分2.sum:求和3.max:最大值4.min:最小值注意:前面四个必须针对数值字段,且参数只能是一个5.count:求个数 二.分组查询1.语法是 group by 分组 ...