简单了解Django ContentType内置组件

 更新时间:2019年07月23日 09:49:58   作者:little_pd  
这篇文章主要介绍了简单了解Django ContentType内置组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、引出问题

假如有这两张表,它们中的课程可能价格不一样、周期不一样、等等...不一样...,现在有一张价格策略表,怎么就用一张表报保存它们之间不同的数据呢?

可能你会这样:

确实是行!但是,如果有很多不同类型的课程,那么这样表就太多空值了!

没办法,这一张表不行,再创建一张不就行了,就像这样:

确实,对于这种情况,Django就是这样做的。

现在,有了 ContentType,我们只需创建三张表,就实现跟上面的效果一模一样了。

这是因为 Django 本身就会新建 django_content_type 这张表,这张表就保存了 model 中的表名。

二、ContentType

那么怎么创建这种关系呢?如下:

这里,DegreeCourse 表没有使用 GenericRelation,则不能使用下面说的第3点,否则报错,要想使用就跟 Course 表一样添加即可。

对于 GenericRelation 和 GenericForeignKey 类型字段,不会在数据库生成列!

三、测试

# views.py
from django.shortcuts import HttpResponse
from django.contrib.contenttypes.models import ContentType
from appxx import models

1、在价格策略表中添加一条数据。

# 方式1
def test(request):
  models.PricePolicy.objects.create(
    price=100,
    valid_period=7,
    object_id=3,
    content_type=ContentType.objects.get(model="course")
  )
  return HttpResponse("ok")
# 方式2
def test(request):
  models.PricePolicy.objects.create(
    price=200,
    valid_period=14,
    content_object=models.Course.objects.get(id=3) # 对应Course表id为3的价格策略
    # content_object=models.DegreeCourse.objects.get(id=2) # 对应DegreeCourse表id为2的价格策略
  )
  return HttpResponse("ok")

2、 根据某个价格策略对象,找到对应的表和数据。(是根据 GenericForeignKey类型字段实现的)

def test(request):
  obj = models.PricePolicy.objects.get(id=1)
  print(obj.content_object.id, obj.content_object.name) # 自动找到
  return HttpResponse("ok")

3、 找到某个课程关联的所有价格策略。(是根据 GenericRelation 类型字段实现的)

def test(request):
  obj = models.Course.objects.get(id=1)
  for item in obj.policy_list.all():
    print(item.id, item.price, item.valid_period)
  return HttpResponse("ok")

关系图:

四、总结

什么时候才用ContentType?

当一张表跟 n 张表动态地创建 ForeignKey 关系时,而不是创建太多列,因为数据表中会有很多空值。

ContentType 通过仅两列字段就实现了 n 张表的 ForeignKey 关系。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python FastAPI 多参数传递的示例详解

    Python FastAPI 多参数传递的示例详解

    这篇文章主要介绍了Python FastAPI 多参数传递,FastAPI通过模板来匹配URL中的参数列表,大概分为三类方式传递参数,每种方式结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 对python读写文件去重、RE、set的使用详解

    对python读写文件去重、RE、set的使用详解

    今天小编就为大家分享一篇对python读写文件去重、RE、set的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python实现数据清洗(缺失值与异常值处理)

    python实现数据清洗(缺失值与异常值处理)

    今天小编就为大家分享一篇python实现数据清洗(缺失值与异常值处理),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python的json包位置及用法总结

    python的json包位置及用法总结

    在本篇内容里小编给大家分享了关于python的json包用法详解内容,需要的朋友们跟着学习下吧。
    2020-06-06
  • python 30行代码实现蚂蚁森林自动偷能量

    python 30行代码实现蚂蚁森林自动偷能量

    这篇文章主要介绍了python 30行代码实现蚂蚁森林自动偷能量的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • Python 将Matrix、Dict保存到文件的方法

    Python 将Matrix、Dict保存到文件的方法

    今天小编就为大家分享一篇Python 将Matrix、Dict保存到文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 使用Matlab将矩阵保存到csv和txt文件

    使用Matlab将矩阵保存到csv和txt文件

    这篇文章主要介绍了使用Matlab将矩阵保存到csv和txt文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Tensorflow:转置函数 transpose的使用详解

    Tensorflow:转置函数 transpose的使用详解

    今天小编就为大家分享一篇Tensorflow:转置函数 transpose的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 使用python更改Word文档字体的操作代码

    使用python更改Word文档字体的操作代码

    更改文字字体是编辑和美化Word文档时的一项常见需求,使用合适的字体不仅可以提升文档的整体视觉效果,还能突显关键信息,本文将介绍如何通过Python代码更改Word文档字体,实现批量操作与自动化,需要的朋友可以参考下
    2024-08-08
  • 如何表示python中的相对路径

    如何表示python中的相对路径

    在本篇文章里小编给大家分享的是关于python相对路径写法以及相关知识点内容,需要的朋友们可以学习下。
    2020-07-07

最新评论