每當我們建立了新的model並執行資料庫遷移後,contenttype表中就會自動新增一條記錄。如下:
那麼這個表有什麼作用呢?這裡提供乙個場景,網上**購物時,會有各種各樣的優惠券,比如通用優惠券,滿減券,或者是僅限特定品類的優惠券。在資料庫中,可以通過外來鍵將優惠券和不同品類的商品表關聯起來:
from django.db import如果是通用優惠券,那麼所有的foreignkey為null,如果僅限某些商品,那麼對應商品foreignkey記錄該商品的id,不相關的記錄為null。但是這樣做是有問題的:實際中商品品類繁多,而且很可能還會持續增加,那麼優惠券表中的外來鍵將越來越多,但是每條記錄僅使用其中的乙個或某幾個外來鍵字段。models
class
electrics(models.model):
"""id name
1 日立冰箱
2 三星電視
3 小天鵝洗衣機
"""name = models.charfield(max_length=32)
class
foods(models.model):
"""id name
1 麵包
2 烤鴨
"""name = models.charfield(max_length=32)
class
clothes(models.model):
name = models.charfield(max_length=32)
class
coupon(models.model):
"""id name electrics foods clothes more...
1 通用優惠券 null null null
2 冰箱滿減券 1 null null
3 麵包狂歡節 null 1 null
"""name = models.charfield(max_length=32)
electric_obj = models.foreignkey(to='
electrics
', null=true)
food_obj = models.foreignkey(to='
foods
', null=true)
cloth_obj = models.foreignkey(to='
clothes
', null=true)
通過使用contenttypes 應用中提供的特殊欄位genericforeignkey,我們可以很好的解決這個問題。只需要以下三步:
為了更方便查詢商品的優惠券,我們還可以在商品類中通過genericrelation欄位定義反向關係。
classgenericrelation反向查,genericforeignkey正向查,都不會在資料庫中生成字段,只是方便查詢electrics(models.model):
name = models.charfield(max_length=32)
price = models.integerfield(default=100)
coupons = genericrelation(to='
coupon
') #
用於反向查詢,不會生成表字段
def__str__
(self):
return
self.name
class
coupon(models.model):
name = models.charfield(max_length=32)
content_type = models.foreignkey(to=contenttype) #
step 1 關聯contentype表,使當前表與contenttype中的model的對應
object_id = models.positiveintegerfield() #
step 2 對應model表中的id
content_object = genericforeignkey('
content_type
', '
object_id
') #
step 3 (對應的表id,對應的表中的一條資料的id)
def__str__
(self):
return
self.name
#coupon物件 - -----》商品物件
coupon_obj.content_object
#商品物件 - -----》coupon物件
electrics_obj.coupons.all()
標籤中content屬性的注意
最近在查東西的時候,發現網頁中的url後經常出現 這種符號,特別是國外的 一開始也覺得很奇怪,但由於沒空又沒有什麼時間就沒去管了。最近又看到,又剛好不忙就來把它解決掉。在谷歌瀏覽器的元素檢視中可以看到,該問題元素的廬山真面。為a標籤的乙個css屬性,點去該屬性,即問題消失。鎖定目標。google一下...
標籤中content屬性的注意
最近在查東西的時候,發現網頁中的url後經常出現 這種符號,特別是國外的 一開始也覺得很奇怪,但由於沒空又沒有什麼時間就沒去管了。最近又看到,又剛好不忙就來把它解決掉。在谷歌瀏覽器的元素檢視中可以看到,該問題元素的廬山真面。為a標籤的乙個css屬性,點去該屬性,即問題消失。鎖定目標。google一下...
ASP 的Content控制項
contentplaceholderid globalcontent runat server 其中 contentplaceholderid是masterpage中 的id值 可見content控制項不是單獨存在的,它是和 contentplaceholder 控制項一起同時存在,而 conten...