Django包含了一个conenttype应用程序,记录了Django项目中安装的所有模型,为当前项目所有基于Django驱动的model提供了更高层次的抽象接口。

一、概述

ContentTypes应用程序的核心是 django.contrib.contenttypes.models.ContentType:

@python_2_unicode_compatible
class ContentType(models.Model):
app_label = models.CharField(max_length=100)
model = models.CharField(_('python model class name'), max_length=100)
objects = ContentTypeManager() class Meta:
verbose_name = _('content type')
verbose_name_plural = _('content types')
db_table = 'django_content_type'
unique_together = (('app_label', 'model'),) def __str__(self):
return self.name

当我们不创建任何model的情况下就迁移数据库,就会发现在数据表中有名为django_content_type的表

二、安装ContentTypes框架

默认会在setting.py的INSTALL_APP中,如果不小心删除,可通过以下命令生成:

django-admin startprojectINSTALLED_APPS
django.contrib.contenttypes'INSTALLED_APPS

三、ContentType模型

每个实例ContentType都有两个字段,它们唯一地描述了已安装的模型:

app_label:模型所属的应用程序名

model:模型类的名称

name:人类可读的内容类型名称,这取自verbose_name模型的属性

四、ContentType的应用

这里提供一个场景,比如网上商城,会有各种各样的优惠券,比如通用优惠券,在数据库中,我们通过外键将优惠券和不同品类的商品表关联起来。

    id          name                 学位课程        专题课程
1 通用优惠券 null null
2 JavaEE限时免费 1 null
3 人工智能优惠券 null 1
4 Python全栈优惠券 2 null
5 Flask源码解读 null 3

这样做的弊端就是:

1. 随着课程的不断增加, 优惠券表中 字段会不断的增加
2. 对于每一个优惠券字段,不相关的都为null,消耗空间资源

通过使用ContentTypes应用中提供的特殊字段GeniricForeignKey.我们可以很好的解决这个问题

django_content_type:

id     app_label        model
1 admin logentry
2 auth permission
3 auth group
4 auth user
5 contenttypes contenttype
6 sessions session
7 course academiccourse
8 course specialcourse
9 course coupon 1. 在优惠券中定义一个ForerignKey字段,
并关联到django_content_type表。
通常这个字段命名为“content_type”
2. 在model中定义PositiveIntegerField字段
用来存储关联表中的主键
通常这个字段名为object_id
3. 在model中定义GenericForeignKey字段
传入上述两个字段名
class Coupon(models.Model):
"""
优惠券
"""
#优惠券名
name = models.CharField(max_length=32)
#指向contenttype
content_type = models.ForeignKey(to=ContentType)
#关联表中的字段
object_id = models.PositiveIntegerField()
content_object=GenericForeignKey("content_type","object_id")
创建记录和查询
1. 创建优惠券
django = models.AcademicCourse.objects.filter(name="Django开发").first()
coupon = models.Coupon.objects.create(name="Django免费体验",content_object=django)
coupon = models.Coupon.objects.create(name="JavaEE减2000",content_type_id=9,object_id=1) 2.查询优惠券(id=1)绑定了哪些商品
首先查出id=1的优惠券
coupon_obj = models.Coupon.objects.filter(id = 1).first()
coupon_obj.content_type_id #取关联django_content_type表的id
coupon_obj.content_type #点出来的是对象
coupon_obj.object_id #取关联对象的id
coupon_obj.content_object #取出对应的model对象 3.查询django开发的所有优惠券
一种是
models.Coupon.objects.filter(object_id = 2,content_type_id=9).all()
第二种是
反向查询,需要在每个商品表中添加
coupons = GenericRelation(to='Coupon')
python_obj = models.SpecialCourse.objects.filter(id = 2).first()
python_obj.coupon.all()
 

Django的ContentType框架django_conent_type的更多相关文章

  1. Web框架本质及第一个Django实例 Web框架

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  2. Django 前端Wbe框架

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  3. Django学习---Web框架及基础知识

    Django学习---Web框架 web框架的本质 我们在学socket,我们创建一个socketserver,然后运行起来,有一个client客户端要连接socket服务端,连接上之后,如果两边都没 ...

  4. Django REST framework框架介绍和基本使用

    Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...

  5. Django之ContentType组件

    一.理想表结构设计 1.初始构建 1. 场景刚过去的双12,很多电商平台都会对他们的商品进行打折促销活动的,那么我们如果要实现这样的一个场景,改如何设计我们的表? 2. 初始表设计 注释很重要,看看吧 ...

  6. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  7. Django的RestfulAPI框架RestFramework

    Django的Restful-API框架 安装框架 #sudo pip3 install django #sudo pip3 install markdown #sudo pip3 install d ...

  8. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  9. Django Rest Framework框架 ---- url控制器

    Django Rest Framework框架 ---- url控制器

随机推荐

  1. c++11 智能指针 unique_ptr、shared_ptr与weak_ptr

    c++11 智能指针 unique_ptr.shared_ptr与weak_ptr C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer), ...

  2. MugLife app是一款可以将静态照片变成3D动画的手机应用

    MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种算法是如何实现的呢? 这里给出一篇论文“Brin ...

  3. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...

  4. laravel Collection mapToDictionary 例子

    源码 示例 <?php require __DIR__ . '/bootstrap/app.php'; $arr = [ [ 'name' => 'John', 'age' => 2 ...

  5. Linux系统之路Centos7.2——安装QQ 的一些问题(附VMware的安装)

    1.首先安装wine 可以通过源码安装,注意在编译的时候加参数,编译64位(如果你的系统是64位哦!) 但是我建议直接rpm安装. 安装网络源: rpm -ivh epel-release-6-8.n ...

  6. ssl证书生成与验证

    要做这件事情的起因在于,代码的升级包放在一个https的服务器上,我们的设备要实现升级,则是通过wget 获取https上的升级包,并且要实现验证证书的功能,这样可以防止设备被恶意篡改升级成其他文件包 ...

  7. springboot中如何添加第三方的jar包或者说如何配置本地jar

    首先推荐博客: spring-boot-maven-plugin 安装本地jar 包 http://www.cnblogs.com/acm-bingzi/p/mavenSpringBootPlugin ...

  8. MySQL内存计算器

    MySQL如何使用内存? 首先,介绍MySQL使用内存的一些方法: 1. 会话级别的内存消耗(连接私有内存):如sort_buffer_size等,每个会话都会开辟一个sort_buffer_size ...

  9. python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)

    1.用我们之前学过的求一下平方(只有一个列表) #求平方 num=[1,5,6,2,7,8] a=[] for n in num: a.append(n**2) print (a) C:\python ...

  10. JavaScript中的arguments详解

    1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...