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')
相關文章
相關標籤/搜索