ContentTypes

  • django 中的一个应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口。

  • Contenttypes应用的核心是ContentType模型

    位于: django.contrib.contenttypes.models.ContentType

  • django 创建项目之后会 会自动在配置文件中安装好 中间件中的'django.contrib.contenttypes',

  • 执行数据库迁移命令之后 数据中会创建一个名为django_content_type的表

    • 记录了 :
    • app_label字段存储了APP的名称,model字段存储了APP下的具体的模型类的名称。

主要用来做表跟表之间的关联:

应用场景:

表结构 : 发表的说说表 发表的图片 以及 每张表的评论内容

使用 : ContentType 表 在评论表中 定义外键 关联 这张表

因为: 一条数据 或一张图片 会有 多条评论 多对一 的关系 还要加一个 对应的 对象id 的字段 作为关联

但是 : 关联的 ContentType 表 和 每张表的 对象的 id 没有关系 所以 就用到了 GenericForeignKey 将这两个字段关联起来 content_object = GenericForeignKey('table_name', 'obj_id') 注意:这两个参数顺序不能乱 这个字段 不会在数据库中创建

通过 说说 或者 图片 来 查询关联的 评论 因为没有 实际的 关联 这就用到了 GenericRelation 用于 反向查询

comments = GenericRelation('Comment', object_id_field='obj_id', content_type_field='table_name')

**注意 **object_id_fieldcontent_type_field 参数 如果 评论表中 定义的 contenttype外键 和 关联的 外键的 id 字段 的 两个字段名 为 object_idcontent_type 就不用 修改这两个参数 使用默认的就行 如果 名字是自定义的 就要 更改 这两个参数 指定 对应的 字段名

model表结构:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
# Create your models here. class Talk(models.Model):
"""说说"""
info = models.TextField()
comments = GenericRelation('Comment', object_id_field='obj_id', content_type_field='table_name') class Picture(models.Model):
"""图片"""
img = models.CharField(max_length=128)
# 方便反向查询的时候 (不会再数据库中创建这个字段,只是提供了一些方便操作的方法)
comments = GenericRelation('Comment', object_id_field='obj_id', content_type_field='table_name') class Comment(models.Model):
"""评论"""
info = models.TextField()
# talk = models.ForeignKey(to='Talk', null=True, on_delete=models.CASCADE)
# picture = models.ForeignKey(to='Picture', null=True, on_delete=models.CASCADE) # 关联表的表名(外键 --> Django Content Type表)
table_name = models.ForeignKey(to=ContentType)
# 关联表中具体的数据id
obj_id = models.IntegerField()
# 告诉Django table_name和obj_id是一组动态关联的数据
content_object = GenericForeignKey('table_name', 'obj_id')

查询时:

# 创建数据
talk_obj = models.Talk.objects.create(info='随便说点什么') # 创建评论对象 可以将 被关联的 talk_obj 直接 传递给 这张表的 content_object 字段 可以直接保存数据
models.Comment.object.create(info='写的什么鬼东西!', content_object=talk_obj) # 通常反向查询 根据 实际发表的 内容 查询该内容的 评论 # 通过 单一的图片 查询 该对象对应的所有评论
ret = models.Picture.objects.filter(id=1).farst()
# 直接使用 管理对象 中添加的 用于反向查询的字段 来查询这个字段对应的 所有的数据
comment_all = ret.comments.all()
print(comment_all) # 正向查询 注意: table_name_id 对应的是 关联的 contenttype表中保存的 对应的models 表的名字 的 id # 也就是对应的表 obj_id 对应的 是这张表中对应的单个对象的 id
ret = models.Comment.objects.filter(table_name_id=4, obj_id=3)
print(ret)

ContentTypes 的应用的更多相关文章

  1. Django contenttypes 组件

    contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...

  2. Django contenttypes组件

    contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...

  3. Django的contenttypes

    这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系. 比如说有两种不同课程,这两种课程都有价格周期和策略.如果最低级的则是给每个表创建一个价格策略.如果非要在同一个表内使用 ...

  4. Django contenttypes 应用

    Django contenttypes 应用 什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Dja ...

  5. contenttypes组件 (处理大量外键)

    介绍 Django contenttypes是一个非常有用的框架,主要用来创建模型间的通用关系(generic relation).   https://www.cnblogs.com/huchong ...

  6. 「Django」contenttypes基本用法

    当一张表和多个表ForeignKey关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes,只需定义三个字段就搞定! contenttypes 是Django内置的一个应用 ...

  7. contenttypes - django组件

    一.contenttypes介绍 它的作用:可以通过两个字段让表和N张表创建FK关系 二.ContentType.GenericForeignKey.GenericRelation 表结构: from ...

  8. 路飞学城知识点4之Django contenttypes 应用

    Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...

  9. Django之contenttypes的应用

    Django contenttypes 应用 简介 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我 ...

随机推荐

  1. MyBatis:事务回滚

    事务的隔离级别:DEFAULT.READ_UNCOMMITED.READ_COMMITTED.REPEATABLE_READ.SERIALIZABLE 事务的传播行为:REQUIRED.SUPPORT ...

  2. 我是如何解决java.security.cert.CertPathValidatorException异常的

    目录 问题来了 问题分析 解决问题 重新安装服务器端证书 日志带来曙光 刨根到底 总结 附录 tomcat的SSL配置 服务器端证书配置 Keytool命令常用参数 问题来了 昨天,我还在我的工位上愉 ...

  3. Spring Data REST API集成Springfox、Swagger

    原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST,你可以迅速为Spring Da ...

  4. 汇编语言--微机CPU的指令系统(五)(字符串操作指令)

    (11)字符串操作指令 字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的.字符串操作指令可对内存单元按字节.字或双字进行处理,并能根据操作对象的 ...

  5. laravel使用Schema创建数据表

    1.简介 迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel的schema构建器结对从而可以很容易地构建应用的数据库表结构.如果你曾经告知小组成员需要手 ...

  6. 洛谷P4704 太极剑(乱搞)

    题意 题目链接 Sol 不会正解 写了发暴力过了,貌似跑的还挺快?.. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include< ...

  7. 2018-11-09 VS Code英汉词典插件v0.0.4-驼峰下划线命名

    首先, 在两天时间内安装数破百, 多谢支持. VS Code插件市场地址: 英汉词典 - Visual Studio Marketplace 开源库地址同前文: Visual Studio Code插 ...

  8. Echarts纵坐标显示为整数小数

    chart.DoubleDeckBarChart = function (getIDParam, Legend, xAxisData, seriesName1, seriesName2, series ...

  9. Android 内存管理中的 Shallow heap Retained heap

    所有包含Heap Profling功能的工具(MAT,Yourkit,JProfiler,TPTP等)都会使用到两个名词,一个是Shallow heap Size,另一个是 Retained heap ...

  10. 使用 float 存储小数?

    很多程序员就会使用 float 类型来存储小数.sql 的 float 类型和其他大多数编程语言的 float 类型一样, 根据IEEE 754 标准使用二进制格式编码实数数据. 但是很多程序员并不清 ...