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简单应用的更多相关文章

  1. Python-Django 第一个Django app

    第一个Django app   by:授客 QQ:1033553122 测试环境: Python版本:python-3.4.0.amd64 下载地址:https://www.python.org/do ...

  2. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)

    编写你的第一个 Django app,第二部分(Page 7)转载请注明链接地址 本教程上接前面的教程.我们会配置数据,创建你的第一个 model,并对Django 自动生成的 admin 站点进行快 ...

  3. django内置 Contenttypes 框架

    一.什么是Django ContentTypes? 1.Django 包含一个ContentTypes 应用,它可以追踪安装在你的Django 项目里的所有应用,并提供一个高层次的.通用的接口用于与你 ...

  4. Django APP打包重用

    引言 有时候,我们需要将自己写的app分发(dist)给同事,分享给朋友,或者在互联网上发布,这都需要打包.分发我们的app. Django的子系统重用是基于app级别的.也就是一个项目可以包含多个互 ...

  5. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  6. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  7. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  8. Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)

    编写你的第一个 Django app,第六部分(Page 11)转载请注明链接地址 本教程上接前面第五部分的教程.我们构建了一个经过测试的 web-poll应用,现在我们会添加一个样式表和一张图片. ...

  9. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)

    编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...

随机推荐

  1. 《Qt on Android核心编程》相关资源

    有不少朋友反馈在搭建 Qt on Android 开发环境时遇到了问题,诸如 Android SDK 无法下载. jdk 找不到合适的版本号.创建 AVD 出错等等.为此我把与<Qt on An ...

  2. java学习笔记——日期处理

    获取系统当前时间使用:java.util.Date类,而这个Date的构造方法如下: 无参构造:public Date() 有参构造:public Date(long date) 第一个实例: imp ...

  3. 飘逸的python - 实现一个pretty函数美丽的输出嵌套字典

    演示样例: d = { "root": { "folder2": { "item2": None, "item1": N ...

  4. iOS技巧

    在不使用加急的情况下,可以利用appstore“可以随时修改上架时间和发布国家.价格而无需再次审核”的规则,先提交小国市场快速过审,准备上架销售时再改回中国——如同样是中文版本,你可以先把游戏上到新加 ...

  5. CocoaPods安装及相关命令

    具体安装参考: http://www.jianshu.com/p/dfe970588f95 http://www.jianshu.com/p/9e4e36ba8574 我就说一个,安装cocoapod ...

  6. Tomcat Https配置

    一.生成KeyStore 打开命令行,输入:keytool -genkey -alias tomcat_server -keyalg RSA -storepass jimmypwd -validity ...

  7. java在linux上始终无法用jdbc跟myql连接

    确实手动在机器上连接mysql没问题的话,尝试下面的方法   a.重启网卡 b.重启系统

  8. 【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合

    前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybati ...

  9. js获取url传递参数值

    function request(paras)     {          var url = location.href;          var paraString = url.substr ...

  10. 面向对象-Object类

    一.Object类中的equals()方法 equals(Object obj) :指示其它某个对象是否与此对象"相等". 返回值类型是boolean Oblect类中的equal ...