简单了解Django ContentType内置组件
作者:little_pd 发布时间:2022-08-04 08:57:16
一、引出问题
假如有这两张表,它们中的课程可能价格不一样、周期不一样、等等...不一样...,现在有一张价格策略表,怎么就用一张表报保存它们之间不同的数据呢?
可能你会这样:
确实是行!但是,如果有很多不同类型的课程,那么这样表就太多空值了!
没办法,这一张表不行,再创建一张不就行了,就像这样:
确实,对于这种情况,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 关系。
来源:https://www.cnblogs.com/believepd/p/10257649.html


猜你喜欢
- 任务1、我的咖啡馆你做主元组coffee_name=('蓝山','卡布奇诺','拿铁',
- 定时任务:1、 线程睡眠函数 sleep() ——粗暴!一直占有 CPU 资源,导致后续操作无法执行2、 threading.Timer(1
- 本文实例讲述了python使用cPickle模块序列化的方法,分享给大家供大家参考。具体方法如下:import cPickledata1 =
- 我就废话不多说了,大家还是直接看代码吧~import kerasimport numpy as npimport matplotlib.py
- 集合创建集合有两种方式:第一种:T = {11,111,"11"}print(T)# {'11', 11
- py 写东西快但是java 生态广比如大数据 py 虽然好 但是利用不到java的整个的生态的代码scala 虽然也好但是毕竟 有些库 需要
- 语法格式:row_number() over(partition by 分组列 order by 排序列 desc)row_num
- 关于python的算法一直都是让我们又爱又恨,但是如果可以灵活运用起来,对我们的编写代码过程,可以大大提高效率,针对算法之一“归并排序”的灵
- 最近,想在我的YouMoney(http://code.google.com/p/youmoney/)里面增加提取用户操作系统版本信息。比如
- 一:mysql官网下载https://dev.mysql.com/downloads/file/?id=494993
- ChromeDriver 是 google 为网站开发人员提供的自动化测试接口,它是 selenium2 和 chrome浏览器 进行通信的
- set是什么?数学上,把set称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(set elements)。Python把
- 具体代码如下所示:import smtplib, email, os, timefrom email.mime.multipart impo
- 前言用python编程绘图,其实非常简单。中学生、大学生、研究生都能通过这10篇教程从入门到精通!快速绘制几种简单的柱状图。1垂直柱图(普通
- 前言大家好,今天很开心有机会跟大家分享最近几年阿里在低代码领域的思考和实战。我是力皓,目前已经在前端和后端岗位工作了十多年了,近 3 年专注
- pip install xmind 使用場景xmind8 可以打开xmind2020 报错main_fest.xml(xmind8 打开另存
- 一、概述1、描述变量类型注解是用来对变量和函数的参数返回值类型做注解,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。但是,变量
- python列表变量可以存储一个元素,而列表是一个大容器,可以存储N多个元素,程序可以方便的对这些数据进行整体操作(可以存储多个不同的数据类
- 解决了ACCESS数据库路径的问题!采用DBType=0或DBType=1来区分AC库还是MSSQL库具体采用AC库时应注意的事项,请看程序
- 摘要:现代网站和web应用程序趋向于依赖客户端的大量的javascript来提供丰富的交互。特别是通过不刷新页面的异步请求来返回数据或从服务