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 = ...
随机推荐
- 2.裴波那契(Fibonacci)数列
裴波那契(Fibonacci)数列 f(n)= ⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契数列的第n项.(题目来自剑指offer) 1.递归解法,效率很低的解法 ...
- PL/SQL变量的作用域和可见性
变量的作用域和可见性设计变量在块中的位置,不同的位置使得变量具有不同的有效性与可访问性. 变量的作用域是指可以使用变量的程序单元部分,可以是包和子程序包等. 当一个变量在它的作用域中可以用一个不限定的 ...
- 设计的一些kubernetes面试题目
这几个月参与了几场面试,设计了多道面试题,觉得可以综合考察应聘人对kubernetes的掌握情况.在这里分享下,供应聘人自查以及其他面试官参考. 这些面试题的设计初衷并不是考察kubernetes的使 ...
- 【Alpha】Scrum Meeting 9
目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第9次会议于4月13日20:00在一公寓3楼召开. 交流确认了任务进度,对下一阶段任务进行分配.时长20min. 任务分配 姓名 当前阶段 ...
- SQL server 批量插入和更新数据
批量插入数据 insert into A表数据库名.[dbo].A(a,b,c) (select a,b,c from B表数据库名.[dbo].B) 批量更新数据 根据身份证第二位更新性别 upda ...
- JS的Date对象、Math、包装类
Date对象 在JS使用Date对象来表示时间 当前时间 var d = new Date(); 指定时间 格式:月/日/年 时:分:秒 var e = new Date("02/16/ ...
- glom初级教程
1.glom介绍 通常对于字典和json的提取我们都是使用如下方式 >>> data = {'a': {'b': {'c': 'd'}}} >>> data['a' ...
- 闽南师范大学·大英A3复习专题
精读<新视野·读写教程A3> U2: words: TEXT A TEXT B appraise vt.评定 | abort vt.(因困难或危险)使(活动)终止 paralyze v ...
- ExtJs常用功能
1.判断内容是否修改 1) var cgrid = query_panel.cgrid; var v = cgrid.getValues(); //console.log(v); if (v != & ...
- vivo 1805的usb调试模式在哪里,开启vivo 1805usb调试模式的流程
经常我们使用安卓手机通过数据线连接上PC的时候,如果手机没有开启usb调试模式,PC则没办法成功识别我们的手机,部分软件也没办法正常使用,此情况我们需要找方法将手机的usb调试模式打开,下面我们讲解v ...