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. JQuery官方学习资料(译):避免与其他库的冲突

    避免与其他库的冲突     JQuery库和它所有的插件都是包含在jQuery命名空间下的,作为一般规则,全局对象被存储在jQuery的命名空间内,所以你不会得到jQuery和任何其他库之间的冲突(例 ...

  2. Linux-cut命令(22)

    cut剪切命令cut命令通常用来对某个文本文件进行解析,擅长处理以一个字符间隔的文本内容 -b :以字节(bytes)为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c ...

  3. struts2_项目运行报404

    1.缺少jar包,commons-lang3-3.2.jar 参考网址:https://blog.csdn.net/u013457382/article/details/50972401 2.stru ...

  4. ANOVA (paper from the onlinestat)

    Introduction Author(s) David M. Lane Prerequisites Variance, Significance Testing,All Pairwise Compa ...

  5. for循环与forEach性能思考

    今日看到一句话: 基于循环的迭代比基于函数的迭代法快8倍,因此有了该篇验证博客. 验证代码如图: 验证结果:在数量比较少的时候,无明显差别,当数量级达到10的4次方时候,for循环的效率优势明显:如图 ...

  6. 文件权限解释rwx

    linux文件权限 r 读w 写x (execute)执行 rwxrw-r-- 解释:rwx文件所有者对该文件有读写执行的权限:rw- 组内用户对该文件有读写的权限:r-- 其他非本组用户对该文件具有 ...

  7. Angular6 项目开发常用时间组件服务

    一.利用Angular 命令行工具生成一个服务. 详情见:<Angular环境搭建>,服务代码如下: import { Injectable } from '@angular/core'; ...

  8. JS获取元素的宽高以及offsetTop,offsetLeft等的属性值

    基本介绍 $(obj).width()与$(obj).height() $(obj).width()与$(obj).height() :jquery方式获取元素的宽高,不包括滚动条与工具条 $(obj ...

  9. 洛谷P4590 [TJOI2018]游园会(状压dp LCS)

    题意 题目链接 Sol 这个题可能是TJOI2018唯一的非模板题了吧.. 考虑LCS的转移方程, \[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1] ...

  10. 如何将web项目部署到weblogic

    在Eclipse中配置weblogic11g服务器: 下载并安装Eclipse:www.eclipse.org 下载并安装Weblogic Server Plugin for Eclipse:http ...