1. 程式人生 > >django之contenttype

django之contenttype

mod png 好的 post IT 一個表 實現 出現 存儲

一 楔子 路飛學城

  路飛學城有兩種收費策略。一是按照學位來收費,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實現。

  

django之contenttype