django中的ContentType使用

2022-03-16 12:22:49 字數 2624 閱讀 8705

每當我們建立了新的model並執行資料庫遷移後,contenttype表中就會自動新增一條記錄。如下:

那麼這個表有什麼作用呢?這裡提供乙個場景,網上**購物時,會有各種各樣的優惠券,比如通用優惠券,滿減券,或者是僅限特定品類的優惠券。在資料庫中,可以通過外來鍵將優惠券和不同品類的商品表關聯起來:

from django.db import

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)

如果是通用優惠券,那麼所有的foreignkey為null,如果僅限某些商品,那麼對應商品foreignkey記錄該商品的id,不相關的記錄為null。但是這樣做是有問題的:實際中商品品類繁多,而且很可能還會持續增加,那麼優惠券表中的外來鍵將越來越多,但是每條記錄僅使用其中的乙個或某幾個外來鍵字段。

通過使用contenttypes 應用中提供的特殊欄位genericforeignkey,我們可以很好的解決這個問題。只需要以下三步:

為了更方便查詢商品的優惠券,我們還可以在商品類中通過genericrelation欄位定義反向關係。

class

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()

genericrelation反向查,genericforeignkey正向查,都不會在資料庫中生成字段,只是方便查詢

標籤中content屬性的注意

最近在查東西的時候,發現網頁中的url後經常出現 這種符號,特別是國外的 一開始也覺得很奇怪,但由於沒空又沒有什麼時間就沒去管了。最近又看到,又剛好不忙就來把它解決掉。在谷歌瀏覽器的元素檢視中可以看到,該問題元素的廬山真面。為a標籤的乙個css屬性,點去該屬性,即問題消失。鎖定目標。google一下...

標籤中content屬性的注意

最近在查東西的時候,發現網頁中的url後經常出現 這種符號,特別是國外的 一開始也覺得很奇怪,但由於沒空又沒有什麼時間就沒去管了。最近又看到,又剛好不忙就來把它解決掉。在谷歌瀏覽器的元素檢視中可以看到,該問題元素的廬山真面。為a標籤的乙個css屬性,點去該屬性,即問題消失。鎖定目標。google一下...

ASP 的Content控制項

contentplaceholderid globalcontent runat server 其中 contentplaceholderid是masterpage中 的id值 可見content控制項不是單獨存在的,它是和 contentplaceholder 控制項一起同時存在,而 conten...