Django ContentType 数据表
ContentType介绍安装
- 简介:
Django包含一个contenttypes应用,
它可以追踪Django项目里安装的所有应用,
提供一个高层次的、通用的接口用于与模型交互。
- 实现:
ContentType位于django.contrib.contenttypes.models.ContentType。
ContentType的实例对象表示并保存项目中安装的模型的信息,
每当有新的模型时会自动创建新的ContentType实例对象。
- ContentType中的实例化对象所对应的数据信息:
ContentType的实例可以返回它们表示的模型类以及从这些模型查询对象。
ContentType还有一个自定义的管理器,
它添加的方法可以与ContentType一起工作,
用于获得特定模型的ContentType实例
模型和ContentType之间的关系还可以用于
模型的一个实例和任意一个已经安装的模型的实例建立“generic关联”。
- 安装:
- 在创建Django项目的时候,会自动将该APP注册到配置文件的 INSTALLED_APPS 所对应的 列表中;
- 若将 INSTALLED_APPS 列表 进行了自定义,想要使用ContentType,需要将该APP自行添加到列表中即可;
INSTALLED_APPS = [ # ContentType的APP 'django.contrib.contenttypes', # 自己注册的APP 'crm.apps.CrmConfig', 'rbac.apps.RbacConfig', ]
ContentType基本用法
- ContentType模型
- 该类中只有两个字段:app_label,model;用这两个字段联合起来 来表示自己注册APP中所对应的模型类;
- app_label:模型类所在的APP应用的名称
- model:模型类的名称
- ContentType的实例化对象可调用的几种方法:
- obj.get_object_for_this_type(**kwargs):
- 该方法执行的是,该实例化对象指向的APP中模型的一个get查询,需要接受get() 方法中的条件判断
- 返回的是 get() 所返回的数据对象;
- obj.model_class():
- 返回实例对象所表示的模型类;
- ContentTypeManager:
- 自定义的管理器
- 在APP中使用ContentType
- 在自定义的model中添加一个外键关联到ContentType,可以更方便的关联到其他的model class;
- 在自定义的model中添加一个字段,用来存放需要关联的模型在ContentType中的主键值,一般命名为objcet_id
- 在创建一个GenericForeignKey字段,将上面两个字段传进去
- 示例:
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Coupon(models.Model): """ id title food_id fruit_id 1 山东大馒头买一送一 2 null 2 买芒果送贵妃 null 2 id title MyTable_id object_id 1 山东大馒头买一送一 1 2 2 买芒果送贵妃 2 2 """ title = models.CharField(max_length=32) # 第一步建立外键关系 content_type = models.ForeignKey(to=ContentType) # 第二步 声明object_id object_id = models.IntegerField() # 第三步 让content_type, object_id关联 content_obj = GenericForeignKey("content_type", "object_id")
- 反向关联:
。。。暂时不太理解;
ContentType示例用法介绍
- get_object_for_this_type(**kwargs) 和 model_class() 实例使用场景:
- 使用这些方法,你可以编写高级别的泛型代码,在任何已安装的模型上执行查询 — 而不是导入和使用一个特定模型的类,可以通过传递app_label
和model
给ContentType在运行时查找,然后使用这个模型类或从它获取对象。
- 你可以关联另一个模型到ContentType作为一种绑定它的实例到特定模型类的方式,然后使用这些方法来获取对那些模型的访问
- 双十一折扣券示例:
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Food(models.Model): """ id title 1 桃李面包 2 山东大馒头 """ title = models.CharField(max_length=32) # 适用于反向查询不生成字段 coupons = GenericRelation(to="Coupon") class Fruit(models.Model): """ id title 1 泰国金枕 2 贵妃芒 """ title = models.CharField(max_length=32) class Coupon(models.Model): """ id title food_id fruit_id 1 山东大馒头买一送一 2 null 2 买芒果送贵妃 null 2 id title MyTable_id object_id 1 山东大馒头买一送一 1 2 2 买芒果送贵妃 2 2 """ title = models.CharField(max_length=32) # 第一版 多张外键关系 # food_obj = models.ForeignKey(to="Food", null=True, blank=True) # fruit_obj = models.ForeignKey(to="Fruit", null=True, blank=True) # 第二版 我们自己解决 # MyTable = models.ForeignKey(to="MyTable") # object = models.IntegerField() # 第三版 django ContentType # 第一步 跟ContentType表创建外键关系 content_type = models.ForeignKey(to=ContentType) # 第二步 声明object_id object_id = models.IntegerField() # 第三步 让content_type, object_id关联 content_obj = GenericForeignKey("content_type", "object_id")