django之contenttype

一 楔子 路飞学城python

  路飞学城有两种收费策略。一是按照学位来收费,python,C++,Java,另一种是按照部分课程收费,python基础,面向对象,函数,这样一部分来收费。涉及到时间,一个月时长的多少钱,两个月时长的多少钱。数据库

  因此,初版的表格设计以下。django

  四张表,价格策略外键关联课程表。函数

  

  

  进阶1:两张价格策略表的重复的太多,没有必要优化

  

 

  能够在价格策略表后面新添加一列,空表示不相关。spa

  表面上这个没问题解决了。隐患是 课程除了学位课,普通课外,之后可能还有新的种类的课程,若是依照这种思路,每当出现一个新的课程,数据库的表结构就要发生改变,这是不容许的。设计

更好的方法是什么呢?code

 

  进阶2  字段修改成表名,ID这样都多少表都没有关系了。有新的课程出现,也能够解决掉。数据库的结构也不须要改。 是否是很机智,很巧妙。对象

  适用范围:一张表同时和多张表进行关联。blog

  这就是contentype帮咱们实现的效果。

  

  进阶3: 有没有优化的余地呢

    对面价格策略表,数据量很是大的时候,若是忽然间想改一下课程表的名字,若是普通课程表,变为 普通的的课程表。这种状况下,表的改动量是很是巨大的。因此,新添加一个表,存储全部的表名称。价格策略中的表名,关联这个新建的表的id。这样若是,出现想修改某张表的表名的时候,直接对新建的这张表进行修改,就能够。

  实际上,这就是contenttype的内部工做原理。

    适用范围:一张表同时和多张表进行关联。

  这就是contentype帮咱们实现的效果。

  

 

二 代码

  手动实现上述关联。

from django.db import models # Create your models here. class Course(models.Model): '''  普通课程 '''     title = models.CharField(max_length=32) class DegreeCourse(models.Model): '''  学位课程 '''     title = models.CharField(max_length=32) class PricePolicy(models.Model) '''  价格策略 '''     price = models.IntegerField() period= models.IntegerField() course_name = models.CharField(max_length=32,verbose_name='关联的课程表的名称') #这两行代码就是手动实现的关键 course_id = models.CharField(max_length=32,verbose_name='关联的课程表中的行的id') #

  利用contenttype实现。

  视图:

from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType # Create your models here. class Course(models.Model): '''  普通课程 '''     title = models.CharField(max_length=32) #不生成数据库,仅用于反向查找 price_policy_list = GenericRelation('PricePolicy') class DegreeCourse(models.Model): '''  学位课程 '''     title = models.CharField(max_length=32) # 不生成数据库,仅用于反向查找 price_policy_list = GenericRelation('PricePolicy') class PricePolicy(models.Model): '''  价格策略 '''     price = models.IntegerField() period = models.IntegerField() # course_name = models.CharField(max_length=32,verbose_name='关联的课程表的名称') # course_id = models.CharField(max_length=32,verbose_name='关联的课程表中的行的id') course_name = models.ForeignKey(ContentType, verbose_name='关联的课程表的名称') course_id= models.IntegerField(verbose_name='关联的课程表中的行的id') # 帮助快速实现contenttype操做,表中并不添加字段 content_object = GenericForeignKey('course_name','course_id')
相关文章
相关标签/搜索