平时开发过程中,我们会经常遇到这么一个类似的场景,比如

    不同的课程,有不同的价格策略

    不同的课程可使用不同的优惠券(满减券,通用券,专用券)

    不同的评论区,支持的评论

  就拿  不同的课程,有不同的价格策略

    比如现在,有两种课程,一种是专题课程--21天学会python,网络编程..., 另一种就是学位课程--python全栈开发,linux自动化运维

    他们都有不同的价格策略,比如学1月 9.9元,3月27元等

    这两种课程提供的服务也是不一样的

  你会怎么设计表呢?

    既然是分两种课程,设计成两张表,专题课程表和学位课程表

    要一张价格策略表,想两种课程的价格策略在这一张表里,怎么搞?

      策略表和课程表为一对多,这里需要和专题课程表和学位课程表进行外键关联,所以需要table_id字段

      课程表的那个课程,course_id

      当然你还要考虑到,如果以后,我们可能还会扩展课程种类,我们可以再建一个存在 课程表名的表

  django提供了contenttype这么一个app,下面已经帮我们创建好 一个 存储表名的表ContentType

  不仅提供这么一个表,还方便了我们进行添加 table_id和course_id,另外方便我们课程表和策略表关联查询

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) # 关联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()

操作

from django.shortcuts import render,HttpResponse
from app01 import models
from django.contrib.contenttypes.models import ContentType def test(request):
# 常规添加
# models.PricePolicy.objects.create(
# valid_period=7,
# price=6.6,
# content_type=ContentType.objects.get(model='course'),
# object_id=1
# ) # 1.在价格策略表中添加一条数据(利用contenttype进行添加)
# models.PricePolicy.objects.create(
# valid_period=14,
# price=9.9,
# content_object=models.Course.objects.get(id=1)
# ) # 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
# price = models.PricePolicy.objects.get(id=2)
# print(price.content_object.name) # 自动帮你找到 # 3.找到某个课程关联的所有价格策略
# obj = models.Course.objects.get(id=1)
# for item in obj.policy_list.all():
# print(item.id,item.valid_period,item.price)
#
return HttpResponse('...')

  总结:一般需要foreignkey多张表都可以使用这种方式

django之contenttype的更多相关文章

  1. Django之ContentType组件

    一.理想表结构设计 1.初始构建 1. 场景刚过去的双12,很多电商平台都会对他们的商品进行打折促销活动的,那么我们如果要实现这样的一个场景,改如何设计我们的表? 2. 初始表设计 注释很重要,看看吧 ...

  2. django 之 ContentType的使用

    1. ContentType 是干什么用的呢: 1. ContentType: 主要的作用就是Django orm的创建表的时候,可以方便多表查询使用,简化多表查询的过程 2.ContentType ...

  3. python框架之Django(15)-contenttype模块

    假如有一个书城系统,需要给作者和书籍加上评论功能.如果给每个表单独建一个评论表,那么我们以后要扩展其它模块评论功能的时候,还需要随之新建一张评论表,会显得很冗余.对于这种情况,Django 给我们提供 ...

  4. Django组件(五) Django之ContentType组件

    基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...

  5. Django之ContentType详解

    contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. models.py文件的表结构写好后,通过makemigr ...

  6. Django的ContentType框架django_conent_type

    Django包含了一个conenttype应用程序,记录了Django项目中安装的所有模型,为当前项目所有基于Django驱动的model提供了更高层次的抽象接口. 一.概述 ContentTypes ...

  7. Django中contenttype的应用

    content_type表将app名称与其中的表的关系进行保存 通过下边的示例来理解content_type的具体应用: models: from django.db import models fr ...

  8. Django day31 contentType组件,Django的缓存

    一.contentType组件 1.干什么用的? 是一个django内置的一个组件,方便我们快速的连表操作 2.这两个字段都不会在数据库中生成,他只是用来查询,插入的 -在course表中: poli ...

  9. 【Django】ContentType组件

    目录 理解 表结构 使用 @ 好,现在我们有这样一个需求,我们的商城里有很多的商品,然而节日要来了,我们要搞活动. 那么,我们就要设计优惠券,优惠券都有什么类型呢?满减的.折扣的.立减的.等等等... ...

随机推荐

  1. window下安装Node.js NPM

    一.安装Node.js 下载地址:http://nodejs.org/download/ 1..msi文件,直接安装,包括了npm,结束. 2..exe文件,把node.exe所在主目录,加入到系统P ...

  2. iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览

    [iOS]iOS9 3DTouch.ShortcutItem.Peek And Pop技术一览   3DTouch UITouch类里API的变化 iOS9中添加的属性 altitudeAngle 当 ...

  3. java -jar Incompatible argument to function

    原因分析:jar包版本问题 解决方法:到工程中查看代码引用的jar包版本是多少,然后升级jar包,就可以了!

  4. Servlet -doGet() doPost()原理

    一.自定义类只需要重写doGet(HttpServletRequest request, HttpServletResponse response) 和doPost(HttpServletReques ...

  5. makefile的选项LDFLAGS和LIBS的区别

    LDFLAGS是选项,LIBS是要链接的库.都是喂给ld的,只不过一个是告诉ld怎么吃,一个是告诉ld要吃什么. 网上不难搜索到上面这段话.不过“告诉ld怎么吃”是什么意思呢? 看看如下选项: LDF ...

  6. mvn命令若干:

    mvn命令若干: mvn -h,不会用时,可寻求帮助. mvn clean compile,将.java类编译为.class文件: mvn clean test, 执行单元测试.本质上,还是执行了一个 ...

  7. 你不知道的C#ToString方法

    我们都知道,String类型的ToString方法在我们平时的编程中应用非常的广泛,那么,对于那些很有用但又很少用的方法,你又熟悉几个呢?下面直接上代码: .ToString("C" ...

  8. linux运维/自动化开发__目录

    服务器软件安装 nginx apache php mysql oracle tomcat memcached mongodb sqlserver 常用pc端工具安装使用 Xshell         ...

  9. kvm初体验之四:从Host登录Guest的五种方式

    1. virt-viewer virt-viewer -c qemu:///system vm1 2. virt-manager (以非root身份运行) virt-manager -c qemu:/ ...

  10. Canvas清屏的实现

    /** * Canvas清屏的操作 * * 參考资料: http://blog.csdn.net/lfdfhl/article/details/9076001 * */ private void cl ...