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. Beautiful Soup 4.4.0 基本使用方法

    Beautiful Soup 4.4.0 基本使用方法Beautiful Soup 安装 pip install  beautifulsoup4 标准库有html.parser解析器但速度不是很快一般 ...

  2. foreach和volist的区别

      foreach和volist的区别   1.foreach标签foreach标签用于循环输出:foreach(name,item,key)name(必须):要输出的数据模板变量item(必须):循 ...

  3. JavaScript 闭包 面试题

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. 作者:wallimn

    经过这几天对DHTMLXTree的折腾总算是有点眉目了.领导催得紧.组长紧的催. 唉,把握这次机会来好好总结一下DHTMLXTree. 还是老套路.首先来简单了解一下DHTMLXTree. DHTML ...

  5. 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示4

    前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用 ...

  6. memcache和memcached区别

    Memcache是一个自由和开放源代码.高性能.分配的内存对象缓存系统.用于加速动态web应用程序,减轻数据库负载.它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间 ...

  7. Linux系统下如何监测磁盘的使用空间

    不管是我们在安装软件还是监测软件的使用性能,我们都要随时掌握系统磁盘的使用情况. 使用df命令 df df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了 ...

  8. 【Hadoop基础教程】4、Hadoop之完全分布式环境搭建

    上一篇blog我们完成了Hadoop伪分布式环境的搭建,伪分布式模式也叫单节点集群模式, NameNode.SecondaryNameNode.DataNode.JobTracker.TaskTrac ...

  9. SD--怎样增强是同一类出库单使用不同号码段

    在现实的业务中,一个公司有多个销售组织,它们使用同一个出库类型,业务往往希望它们创建的出库单的号码採用不同号码范围.但在sap里出库单号码范围是在出库单类型里设置,也就是使用同样的出库单类型,也就使用 ...

  10. iOS swift NSClassFromString将字符串转换成类名

    在oc中将字符串转换成类名直接调用NSClassFromString("classname")即可,但是到了swift中变的麻烦多了 swift中如果要将字符串转换为类型需要以下几 ...