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_labelmodelContentType在运行时查找,然后使用这个模型类或从它获取对象。

  - 你可以关联另一个模型到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")

 

 

posted @ 2018-11-10 15:51  浮生凉年  阅读(284)  评论(0编辑  收藏  举报