ContentTypes 的应用
ContentTypes
django 中的一个应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口。
Contenttypes应用的核心是ContentType模型
位于:
django.contrib.contenttypes.models.ContentTypedjango 创建项目之后会 会自动在配置文件中安装好 中间件中的
'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_field 和 content_type_field 参数 如果 评论表中 定义的 contenttype外键 和 关联的 外键的 id 字段 的 两个字段名 为 object_id 和 content_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 的应用的更多相关文章
- Django contenttypes 组件
contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...
- Django contenttypes组件
contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...
- Django的contenttypes
这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系. 比如说有两种不同课程,这两种课程都有价格周期和策略.如果最低级的则是给每个表创建一个价格策略.如果非要在同一个表内使用 ...
- Django contenttypes 应用
Django contenttypes 应用 什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Dja ...
- contenttypes组件 (处理大量外键)
介绍 Django contenttypes是一个非常有用的框架,主要用来创建模型间的通用关系(generic relation). https://www.cnblogs.com/huchong ...
- 「Django」contenttypes基本用法
当一张表和多个表ForeignKey关联,并且多个FK中只能选择其中一个或其中n个时,可以利用contenttypes,只需定义三个字段就搞定! contenttypes 是Django内置的一个应用 ...
- contenttypes - django组件
一.contenttypes介绍 它的作用:可以通过两个字段让表和N张表创建FK关系 二.ContentType.GenericForeignKey.GenericRelation 表结构: from ...
- 路飞学城知识点4之Django contenttypes 应用
Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...
- Django之contenttypes的应用
Django contenttypes 应用 简介 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我 ...
随机推荐
- MyBatis:事务回滚
事务的隔离级别:DEFAULT.READ_UNCOMMITED.READ_COMMITTED.REPEATABLE_READ.SERIALIZABLE 事务的传播行为:REQUIRED.SUPPORT ...
- 我是如何解决java.security.cert.CertPathValidatorException异常的
目录 问题来了 问题分析 解决问题 重新安装服务器端证书 日志带来曙光 刨根到底 总结 附录 tomcat的SSL配置 服务器端证书配置 Keytool命令常用参数 问题来了 昨天,我还在我的工位上愉 ...
- Spring Data REST API集成Springfox、Swagger
原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST,你可以迅速为Spring Da ...
- 汇编语言--微机CPU的指令系统(五)(字符串操作指令)
(11)字符串操作指令 字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的.字符串操作指令可对内存单元按字节.字或双字进行处理,并能根据操作对象的 ...
- laravel使用Schema创建数据表
1.简介 迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel的schema构建器结对从而可以很容易地构建应用的数据库表结构.如果你曾经告知小组成员需要手 ...
- 洛谷P4704 太极剑(乱搞)
题意 题目链接 Sol 不会正解 写了发暴力过了,貌似跑的还挺快?.. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include< ...
- 2018-11-09 VS Code英汉词典插件v0.0.4-驼峰下划线命名
首先, 在两天时间内安装数破百, 多谢支持. VS Code插件市场地址: 英汉词典 - Visual Studio Marketplace 开源库地址同前文: Visual Studio Code插 ...
- Echarts纵坐标显示为整数小数
chart.DoubleDeckBarChart = function (getIDParam, Legend, xAxisData, seriesName1, seriesName2, series ...
- Android 内存管理中的 Shallow heap Retained heap
所有包含Heap Profling功能的工具(MAT,Yourkit,JProfiler,TPTP等)都会使用到两个名词,一个是Shallow heap Size,另一个是 Retained heap ...
- 使用 float 存储小数?
很多程序员就会使用 float 类型来存储小数.sql 的 float 类型和其他大多数编程语言的 float 类型一样, 根据IEEE 754 标准使用二进制格式编码实数数据. 但是很多程序员并不清 ...