zoukankan      html  css  js  c++  java
  • django之contenttype

    一 楔子 路飞学城

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

      所以,第一版的表格设计如下。

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

      

      

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

      

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

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

    更好的方法是什么呢?

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

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

      这就是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')

      

  • 相关阅读:
    爬虫之Selenium库
    爬虫之pyquery库
    爬虫之BeautifulSoup库
    爬虫之Requests库
    爬虫之Re库
    在Flask中使用Celery
    Celery-分布式任务队列
    MongoDB
    Redis Cluster
    如何使用mongo shell
  • 原文地址:https://www.cnblogs.com/654321cc/p/8545445.html
Copyright © 2011-2022 走看看