Django APP之contenttypes简单应用
Conttenttypes介绍
当你看到contenttype你是不是想到了请求头的contenttype?
但是
此contenttypes不是请求头Content-Type而是Django自带的app

或许你当时没有注意到contenttypes,这里简单的介绍一下,如何用Django自带的contenttypes
业务需求
我们要开设两大门课程,一个是专业课,一个是学位课,
比如专业课有:
- 21天python入门
- 网络编程
- Linux基础
学位课:
- Python全栈开发
- Linux运维
每一个课程有不同的周期,不同的周期对应不同的价格.
比如专业课的21天python入门 周期7天10块钱 周期14天15块钱
那么你如何设计的你表结构呢?
一张学位课表,一张专业课表示必须的,那么价格表如何设计呢?
使用一张价格表?

如果某天我们需要添加一门面授课,那么你需要在价格表上修改字段吗?增加一个Fk对应面授课?
显然不行
那么每一个课对应一张表?那我有10个课,那岂不是有10个价格表?造成了资源的浪费.
那么有什么好的方案?

xid对应着哪一门具体的课程,table_id对应着表的名字,比如第一条table_id对应Course表id为1 21天入门python
下次需要增加课的时候,只需要增加课表,还有在存放表名的表中增加一个id对应的表名就可以解决.
可能你会说这样查询起来很麻烦,NO Django已经帮你做好了.
Conttenttypes的应用
加入表简单的表结构
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class DegreeCourse(models.Model):
"""学位课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255, verbose_name="缩略图")
brief = models.TextField(verbose_name="学位课程简介", ) class Course(models.Model):
"""专题课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255) # 不会在数据库生成列,只用于帮助你进行查询
policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model):
"""价格与有课程效期表"""
content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE) # 关联course or degree_course
object_id = models.PositiveIntegerField() #不会在数据库生成列,只用于帮助你进行添加和查询
content_object = GenericForeignKey('content_type', 'object_id') valid_period_choices = (
(1, '1天'),
(3, '3天'),
(7, '1周'), (14, '2周'),
(30, '1个月'),
(60, '2个月'),
(90, '3个月'),
(180, '6个月'), (210, '12个月'),
(540, '18个月'), (720, '24个月'),
)
valid_period = models.SmallIntegerField(choices=valid_period_choices)
price = models.FloatField()
content_object = GenericForeignKey('content_type', 'object_id')里面的字段名必须是content_type,object_id 因为GenericForeignKey类的源码里已经写清楚了

创建字段
那么我们如何添加一个价格字段?
models.PricePolicy.objects.create(
valid_period=14,
price=9.9,
content_object=models.Course.objects.get(id=1) )
content_object 字段对应的必须是一个对象,是你想要关联的object_id的对象.只要对应了一个对象他就会自动的帮你添加
content_type 对应的存放表id
object_id 对应了课表的id 在你创建表的时候,Djnaog会自动帮你创建第三张表,就是id对应表名

查询
# 2. 根据某个价格策略对象,找到他对应的表和数据,如:关联课程名称
price = models.PricePolicy.objects.get(id=2)
print(price.content_object.name)
# 自动帮你找到对应课程的对象
如果要课程查询所有价格需要在课程表上添加一个字段
# 不会在数据库生成列,只用于帮助你进行查询
policy_list = GenericRelation("PricePolicy")
根据这个字段名可以跨表查询
# 3.找到某个课程关联的所有价格策略
obj = models.Course.objects.get(id=1)
for item in obj.policy_list.all():
print(item.id,item.valid_period,item.price)
什么时候要用contenttypes?
- 某一张表需要对应多个Fk字段的时候 且Fk所对应的表是同一种类型
- 且一旦增加业务的时候,需要在该表增加FK字段
Django APP之contenttypes简单应用的更多相关文章
- Python-Django 第一个Django app
第一个Django app by:授客 QQ:1033553122 测试环境: Python版本:python-3.4.0.amd64 下载地址:https://www.python.org/do ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)
编写你的第一个 Django app,第二部分(Page 7)转载请注明链接地址 本教程上接前面的教程.我们会配置数据,创建你的第一个 model,并对Django 自动生成的 admin 站点进行快 ...
- django内置 Contenttypes 框架
一.什么是Django ContentTypes? 1.Django 包含一个ContentTypes 应用,它可以追踪安装在你的Django 项目里的所有应用,并提供一个高层次的.通用的接口用于与你 ...
- Django APP打包重用
引言 有时候,我们需要将自己写的app分发(dist)给同事,分享给朋友,或者在互联网上发布,这都需要打包.分发我们的app. Django的子系统重用是基于app级别的.也就是一个项目可以包含多个互 ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)
编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)
编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...
- Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
编写你的第一个 Django app,第六部分(Page 11)转载请注明链接地址 本教程上接前面第五部分的教程.我们构建了一个经过测试的 web-poll应用,现在我们会添加一个样式表和一张图片. ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)
编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...
随机推荐
- 2017.4.18 linux中执行某文件提示权限不够
因为没有对start.sh文件的执行权限,所以提示权限不够. 加一个执行权限: chmod +x start.sh 可以看到,执行权限已经有了.此时再执行,就ok了.
- NeatBean下ssh 私钥格式问题
1. SecureCRT 生成的private key 的格式是其私有的格式, 2. 标准格式为 openssl 格式
- Laravel之认证服务
一.用户认证 配置文件在config/auth.php下 1.添加认证路由 // 认证路由... Route::get('auth/login', 'Auth\AuthController@getLo ...
- Service和Activity交互之广播方式
一.使用场景如果要通知多个Activity,广播较为适合.但广播较为耗费性能. 二.Broadcast更新Activity中的UI 1.新建一个接口OnUpdateUI,用于回调更新UI public ...
- mysql导出查询结果到文档
其实挺简单,就一个命令 select * from my_table into outfile '/tmp/abc.xls'; 然后就是ftp把文件弄回本地了.我的是程序自动放到C:\下 另外,还 ...
- css 用 display: inline-block; 代替 float
浮动可以将两个块级元素浮动在同一水平上.但float的缺点也有很多,还需要其他样式弥补. 早年我使用过 display: inline-block; 但苦于兼容性问题一直没敢全面使用. 近几年主要玩移 ...
- Android服务类Service具体解析
Service有什么作用? 很多人不明确service是用来干嘛的.事实上Service作为Android四大组件之中的一个,能够理解为一个执行在后台的Activity.它适用于处理一些不干扰用户的长 ...
- Ubuntu 16.04主题美化和软件推荐
http://www.linuxidc.com/Linux/2016-09/135165.htm http://www.techweb.com.cn/network/system/2015-11-20 ...
- centos root登录password 忘记解决的方法
Centos系统 登陆root忘记password 解决方式: (1)开机启动系统,在进入linux系统之前按键Esc 进入例如以下界面:(须要注意:Centos是安装在虚拟机里面的话,须要将鼠标点进 ...
- NPOI 添加下拉列表
需求 给指定列添加下拉列表.如下图: 思路 NPOI的文档网站不能访问了,这里参考的POI文档. 加下拉列表有两种方式,一种直接写字符串,例如 new String[]{"10", ...