简单了解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
猜你喜欢
- 注意主窗口一定要为tk.Tk(),在主窗口上通过button的点击相应子函数创建子窗口,注意此时创建出来的窗口必须是Toplevel,否则出
- python有时候需要清除字符串前后空格,而字符本身的空格不需要清除掉,那就不能用正则re.sub来实现。这时用到strip()函数用法:s
- 先介绍一下jsSmarty Project:简要说明:利用JavaScript?在客户端完成SmartyPhp的工作,加速模板开发。主要是利
- 本文实例为大家分享了用python实现五子棋的具体代码,供大家参考,具体内容如下# 制作一个棋盘"""++++
- 本文实例讲述了Python实现获取nginx服务器ip及流量统计信息功能。分享给大家供大家参考,具体如下:#!/usr/bin/python
- 本文介绍的MySQL数据库的出错代码表,依据MySQL数据库头文件mysql/include/mysqld_error.h整理而成。详细内容
- base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信
- 汉字转为拼音的asp函数,原理:利用多维数组 1.添加索引 2.遍历数组Author: Unknowasp之家测试截图,呵呵不错:<%
- 查看Tensor尺寸及查看数据类型Tensor尺寸查看命令:x.shape例子:input = torch.randn(20,16,50,3
- 安装库位置和显示方式简单总结:一、位置的不同 1.自带库在环境的 lib\\os.py&nb
- CSS制作滑动折叠的文字效果,可以用于二级导航菜单的制作,不错的下拉菜单。<!DOCTYPE html PUBLIC "-/
- 如下所示:#保存 cookie 到变量import urllib.requestimport http.cookiejarcookie =
- 虽然淘宝商城的名字中带有“商城”两字,但是很显然的,淘宝商城并不是一个B2C商城,淘宝商城仍只是一个C2C平台,充其量只是个收费版的淘宝。在
- 今天暴风彬彬要讨论的网站可用 * ,是让你的网站文字链接提高一定的可用性,而且实现起来非常简单,其实这也算是提高用户体验的方法。扩大可点击区
- <?php /********************************************** *&n
- 数独规则数独游戏,经典的为9×9=81个单元格组成的九宫格,同时也形成了3×3=9个小九宫格,要求在81个小单元格中填入数字1~9,并且数字
- 如代码1所示: // 代码 1 // 外观层类 class LWordHomePage { // 添加留言 public function
- import wx import imagesclass DemoTaskBarIcon(wx.TaskBarIcon): &nb
- 一、k-近邻算法原理及API1.k-近邻算法原理如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则
- XML.DOM需求有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样。上游跑时会根据