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 = ...
随机推荐
- topcoder srm 600 div1
problem1 link 首先,如果一个数字的某一位是1但是$goal$的这一位不是1,那么这个数字是不用管它的.那么对于剩下的数字,只需要统计在$goal$为1的位上,这些数字对应位上也是1的数字 ...
- python第一天2.28
2019年2月28日 今日内容大纲: 01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 运行速度:飞机 内存:临时存储数据. 8g,16g, 运行速度:高铁 1,成 ...
- Page.Cache
https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.page.cache?view=netframework-4.8 Gets the ...
- 十个经典的Python面试题
1.Python下多线程的限制以及多进程中传递参数的方式 Python多线程有个全局解释器锁,这个锁的意思是任一时间只能有一个线程运用解释器.并发不是并行. 多进程间同享数据,能够运用multipro ...
- Unable to start Ocelot because either a ReRoute or GlobalConfiguration
在ASP.Net Core项目APIGateway中添加Ocelot+Consul然后运行时 ,VS2017报如下错 : 内部异常 1: Exception: Unable to start Ocel ...
- [转载]linux下网卡漂移导致网络不可用
转自:https://blog.csdn.net/hyatsz/article/details/47690993 linux下网卡漂移导致网络不可用 2015年08月16日 00:48:50 hyat ...
- JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
下载并安装易邮邮件服务器MailServer和腾讯邮箱FoxMail,下载地址 https://download.csdn.net/download/checkerror2/10130538 具体步 ...
- CentOS7攻克日记(三) —— 安装Python3.6
我是在EVERNOTE上面写的,本来格式是有代码段的,结果复制上来就没有了,所以会有一点乱,我就不调整了 我主要安装的是python环境,这一篇主要解决一下python的问题.在这里给个建议,安装 ...
- laravel文件上传
一.视图文件代码 <td> <input type="file" name="brand_logo" id="logo" ...
- ios中关键词weak,assign,copy.strong等的区别
虽然开发IOS好多年了.但是这几个关键词总是深深困扰着我.加上IOS开发从mRC到ARC的过渡,这些概念更为困扰我了. 先说weak与assign.weak只能修饰对象,不能修饰基本数据类型.而ass ...