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表结构:

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

查询时:

  1. # 创建数据
  2. talk_obj = models.Talk.objects.create(info='随便说点什么')
  3. # 创建评论对象 可以将 被关联的 talk_obj 直接 传递给 这张表的 content_object 字段 可以直接保存数据
  4. models.Comment.object.create(info='写的什么鬼东西!', content_object=talk_obj)
  5. # 通常反向查询 根据 实际发表的 内容 查询该内容的 评论
  6. # 通过 单一的图片 查询 该对象对应的所有评论
  7. ret = models.Picture.objects.filter(id=1).farst()
  8. # 直接使用 管理对象 中添加的 用于反向查询的字段 来查询这个字段对应的 所有的数据
  9. comment_all = ret.comments.all()
  10. print(comment_all)
  11. # 正向查询 注意: table_name_id 对应的是 关联的 contenttype表中保存的 对应的models 表的名字 的 id # 也就是对应的表 obj_id 对应的 是这张表中对应的单个对象的 id
  12. ret = models.Comment.objects.filter(table_name_id=4, obj_id=3)
  13. 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. 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

    在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...

  2. strdup strcpy 的区别

    strdup可以直接把要复制的内容复制给没有初始化的指针,因为它会自动分配空间给目的指针 strcpy的目的指针一定是已经分配内存的指针

  3. adb命令笔记

    adb devices [-l]: 列出所有连接设备 l: 列出设备限定符 adb connect <host>[:<port>]: 通过ip连接到设备 host: IP po ...

  4. CSS选择器:子选择符号

    <html> <head> <style type="text/css"> .class>h2{color:red} </style ...

  5. iOS----------SVN问题 the operation could not be completed

    可能是服务器磁盘满了或者你本地的内存满了

  6. vue 构建项目遇到的问题

    1.我在打包完成后,打开index.html文件发现地址并没有携带路由. config下的 index.js 中的build命令的配置有一个属性叫assetsPublicPath,它的值为‘/’.意思 ...

  7. H264-YUV通过RTP接收视频流ffmpeg解码SDL实时播放

    写在前面的话 写一个简单的播放器,通过RTP接收视频流,进行实时播放.最初,使用ffplay或者vlc接收按照SDP协议文件可以播放视频,但是视频中断后重启,不能正确的解包,时常会出现如下的错误信息. ...

  8. HDU 2086 A1 = ? (找规律推导公式 + 水题)(Java版)

    Equations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086 ——每天在线,欢迎留言谈论. 题目大意: 有如下方程:Ai = (Ai-1 ...

  9. UVA 1152 4 Values whose Sum is 0 (枚举+中途相遇法)(+Java版)(Java手撕快排+二分)

    4 Values whose Sum is 0 题目链接:https://cn.vjudge.net/problem/UVA-1152 ——每天在线,欢迎留言谈论. 题目大意: 给定4个n(1< ...

  10. JHipster生成微服务架构的应用栈(五)- 容器编排示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...