Django content_type 简介及其应用
在网上看到 django ORM 有一个 content_type 字段表的应用,这张表不是我们通过建立model类添加的,而是django自动帮我们生成的,具体的作用先简单的举个例子给大家介绍一下。
首先,创业初期,老板有一个需求,只做线上课程,根据学习周期不同,建立对应价格。
1.没啥好说的,建立两张表,一个课程可以有多个价格套餐,一个价格套餐可以对应多个课程,课程表Course和价格表PriceStrategy(后面简称PS).
class Course(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class PriceStrategy(models.Model):
price = models.IntegerField(verbose_name='课程价格',default=3000)
period = models.IntegerField(verbose_name='学习周期',default=30)
course = models.ManyToManyField(to='Course',related_name='ps')
2.在数据库中录入相关字段:
对于课程:

对于价格套餐:

两张表的对应关系(自动生成的):

3.这样我就可以根据需求来执行相关ORM操作:
比如,取出python全栈这门课程的价格套餐:
course_obj = models.Course.objects.filter(id=1).first()
res = course_obj.ps.all()
for item in res:
price = item.price
period = item.period
print(price,period)
或者,套餐价格12000的课程有哪些:
ps_obj = models.PriceStrategy.objects.filter(price=12000).first()
course = ps_obj.course.first()
这样是没有问题的,但是后期,公司扩大了规模,老板发展了线下课程,要求重建一张OfflineCourse表,绑定价格策略。这样,Course表和OfflineCourse表都要和PS表保持多对多关系,我们知道,ManytoMany只能关联一张表,要想关联两张表,我们必须重新添加一个字段,再用Many2Many关联,这样可以做,但如果后期老板后期又提出了新需求开发了新课程,这样又要添加表,显得比较麻烦。
Django 自动生成的content_type表帮我们解决了这个麻烦:
models.py
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation class Course(models.Model): name = models.CharField(max_length=32)
price = GenericRelation(to='PriceStrategy') class OfflineCourse(models.Model): name = models.CharField(max_length=32)
price = GenericRelation(to='PriceStrategy') class PriceStrategy(models.Model): price = models.IntegerField()
period = models.IntegerField() content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_obj = GenericForeignKey('content_type','object_id')
我们通过ORM语句,利用视图函数录入数据资料,发现PS表:

最后一列,content_type_id 对应的是 content_type表中的id 取对应的model表,object_id是取到的表中数据的id:
需求一:根据价格套餐,找到对应的课程
比如上图中的第4行,content_type_id = 7,取course表,object_id=2,取course表中的id为2的数据,是linux运维课程。

我们来验证一下结果:
views.py:
def test(request):
ps_obj = models.PriceStrategy.objects.get(id=4)
print(ps_obj.content_obj)
return HttpResponse('...')
打印结果正确!
需求二:查找该课程所有的价格套餐
views.py:
def test(request):
course_obj = models.Course.objects.get(id=1)
for item in course_obj.price.all():
print(item.price, item.period)
return HttpResponse('...')
总结:
content_type表的作用,其实就相当于一张地图,根据content_type_id,找到你需要的表,再根据object_id,找到表中你要的数据。这样,无论你老板后来需要加多少表,多少个价格套餐,都可以不用改表结构可以完成。
所以,在例子中PS建立表结构时,额外录入三个字段:
1:content_type 外键关联到django自动生成的content_type表;
2:object_id:正整数,取表中数据的id;
3:content_obj:取哪张表,GenericForeignKey('content_type','object_id'),不会生成额外的列,用来帮助查找数据。
已经有了1,2两个字段,直接点语法取第三个字段,就自然找到了你想要的数据。
同时,反向查找的话,直接点语法取关联字段即可,非常方便,前提是关联字段必须用GenericRelation来关联:
price = GenericRelation(to='PriceStrategy')。
以上就是我作为django菜鸟对于content_type的理解,如有错误,欢迎指正。
Django content_type 简介及其应用的更多相关文章
- python 之 Django框架(Django框架简介、视图装饰器、request对象、Response对象)
12.33 Django框架简介: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器( ...
- Python学习(三十)—— Django框架简介
转载自:http://www.cnblogs.com/liwenzhou/p/8296964.html Django框架简介 一.MVC框架和MTV框架(了解即可) MVC,全名是Model View ...
- Django 中间件简介
Django 中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. ...
- Django框架简介及模板Template,filter
Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...
- Django框架简介与使用注意事项
一.Django框架简介 MVC框架和MTV框架 MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model). ...
- wsgiref模块、web框架、django框架简介
"""web框架:将前端.数据库整合到一起的基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端'""" ...
- 手动搭建简易web框架与django框架简介
目录 纯手写简易web框架 基于wsgiref模块 动静态网页 简单了解jinja2模块 框架请求流程 python主流web框架 django框架 简介 应用app 命令操作django pycha ...
- Django Middleware简介
1 前言 Django使用非常熟练了,各种API接口不在话下,全都搞定.为方便定位问题在每个API接口的的开始和返回的地方都加上了log打印,记录入参和返回值. 但是这样有一个问题,需要每个 ...
- $Django content_type组件 缓存组件
1 content_type组件(只能方便插入添加) 需求:课程,学位课(不同的课程字段不一样),价格策略 #免费课 class Free_classes (models.Model): id = ...
随机推荐
- 利用matplotlib库和numpy库画数学图形
首先,电脑要安装到matplotlib库和numpy库,这可以通过到命令符那里输入“pip install matplotlib ”,两个操作一样 其次,参照下列代码: import numpy as ...
- 踩坑之路---JWT验证
使用JWT验证客户的携带的token 客户端在请求接口时,需要在request的head中携带一个token令牌 服务器拿到这个token解析获取用户资源,这里的资源是非重要的用户信息 目前我的理解, ...
- topcoder srm 615 div1
problem1 link 对于数字$x$,检验每个满足$x=y*2^{t}$的$y$能否变成$x$即可. problem2 link 如果起点到终点有一条长度为$L$的路径,那么就存在长度为$L+k ...
- Python day 04
Day 04 今日内容 补充 1.解释器/编译器 补充:编译型语言和解释型语言? # 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行. # 解释型:写完代码交给解释器,解释器会从 ...
- 单元测试系列之十:Sonar 常用代码规则整理(二)
摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...
- Linux机器学习软件配置
如果需要安装Python+anaconda+pycharm,就不需要单独安装Python了,因为anaconda自带Python https://www.twblogs.net/a/5b7f8c742 ...
- Activiti 工作流之所学所感(基本配置) DAY1
由于公司需求,最近在研究工作流,在此记录一下所学所感以备往后使用时候可以方便查询,有不足之处请各位大牛提点,下面直接进入主题. 下载activiti 所需资料 可以直接在官网上下载,也可以在我的网盘 ...
- Maven项目下的Mybatis逆向工程
IDEA Maven项目的Mybatis逆向工程 1.配置.pom 如果是在多模块开发下,该文件逆向工程要生成的那个模块下的pom文件. <build> <plugins> & ...
- 关于li标签的value属性值的获取问题
在前几天的开发过程中,遇到了这样一个问题. 在li标签中嵌入了一个value属性,如这样滴: <li id="ts1" value="0001">& ...
- Kafka知识总结
1.kafka是什么 类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据. kafka是一个生产-消费模型. Producer:生产 ...