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. T-SQL基础(四)之集合运算

    三个运算符 T-SQL支持三个集合运算符:UNION.INTERSECT.EXCEPT. 集合运算符查询的一般形式如下: Query1 <set_operator> Query2 -- 这 ...

  2. Jmter接口网站压力测试工具使用记录

    1.首先下载Jmeter 官方地址:http://jmeter.apache.org/ 2.安装Jmeter 把下载的文件进行解压,产生如下目录: 打开bin文件夹下的jmeter.bat文件及进入程 ...

  3. php常用函数搜集

    搜集了几个php常用函数方法....相信项目中肯定会用到吧... <?php /** * @param $arr * @param $key_name * @return array * 将数据 ...

  4. 【Java每日一题】20170119

    20170118问题解析请点击今日问题下方的“[Java每日一题]20170119”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...

  5. 你用过CSS3的这个currentColor新属性吗?使用与兼容性

    currentColor顾名思意就是“当前颜色”,准确讲应该是“当前的文字颜色”,例如: .xxx { border: 1px solid currentColor; } currentColor表示 ...

  6. 关于python当中的@修饰符的浅析

    https://blog.csdn.net/class_brick/article/details/81170697     要了解python中@装饰器的作用,首先要记住这么几点: 1. 装饰器符号 ...

  7. Ubuntu添加新分区

    1.查看分区 ~$ sudo fdisk -l 2.添加分区 ~$ fdisk /dev/sda 3.输入m查看帮助 ~$ m 4.输入n新建分区,即添加分区 ~$ n 这里会出现设置分区大小 5.输 ...

  8. 2059-authentication plugin 'caching_sha2_password"cnnot bt loaded :mysql8.0数据库链接不上:

    问题:最近数据库出了问题,就重新安装了数据库8.0,8.0建立数据库时出现问题,错误提示: 2059-authentication plugin 'caching_sha2_password" ...

  9. Nginx 相关介绍(Nginx是什么?能干嘛?)

    Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一资源描述符(Unifor ...

  10. [转] Scala Try 与错误处理

    一.概述 当你在尝试一门新的语言时,可能不会过于关注程序出错的问题, 但当真的去创造可用的代码时,就不能再忽视代码中的可能产生的错误和异常了. 鉴于各种各样的原因,人们往往低估了语言对错误处理支持程度 ...